thunderbolt: Add support for ASMedia NVM image format
authorSzuying Chen <Chloe_Chen@asmedia.com.tw>
Sun, 4 Sep 2022 11:18:00 +0000 (14:18 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Wed, 7 Sep 2022 06:06:51 +0000 (09:06 +0300)
Add support for ASMedia specific NVM image format. This makes it
possible to upgrade the NVM firmware of ASMedia routers in addition to
Intel ones.

Signed-off-by: Szuying Chen <Chloe_Chen@asmedia.com.tw>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/nvm.c

index dc009f496963fa78204e926def8c3035a8f70f46..3dd5f81bd629355ab2274848b02bb08b29d8941b 100644 (file)
 #define INTEL_NVM_CSS                  0x10
 #define INTEL_NVM_FLASH_SIZE           0x45
 
+/* ASMedia specific NVM offsets */
+#define ASMEDIA_NVM_DATE               0x1c
+#define ASMEDIA_NVM_VERSION            0x28
+
 static DEFINE_IDA(nvm_ida);
 
 /**
@@ -149,8 +153,41 @@ static const struct tb_nvm_vendor_ops intel_switch_nvm_ops = {
        .write_headers = intel_switch_nvm_write_headers,
 };
 
+static int asmedia_switch_nvm_version(struct tb_nvm *nvm)
+{
+       struct tb_switch *sw = tb_to_switch(nvm->dev);
+       u32 val;
+       int ret;
+
+       ret = tb_switch_nvm_read(sw, ASMEDIA_NVM_VERSION, &val, sizeof(val));
+       if (ret)
+               return ret;
+
+       nvm->major = (val << 16) & 0xff0000;
+       nvm->major |= val & 0x00ff00;
+       nvm->major |= (val >> 16) & 0x0000ff;
+
+       ret = tb_switch_nvm_read(sw, ASMEDIA_NVM_DATE, &val, sizeof(val));
+       if (ret)
+               return ret;
+
+       nvm->minor = (val << 16) & 0xff0000;
+       nvm->minor |= val & 0x00ff00;
+       nvm->minor |= (val >> 16) & 0x0000ff;
+
+       /* ASMedia NVM size is fixed to 512k */
+       nvm->active_size = SZ_512K;
+
+       return 0;
+}
+
+static const struct tb_nvm_vendor_ops asmedia_switch_nvm_ops = {
+       .read_version = asmedia_switch_nvm_version,
+};
+
 /* Router vendor NVM support table */
 static const struct tb_nvm_vendor switch_nvm_vendors[] = {
+       { 0x174c, &asmedia_switch_nvm_ops },
        { PCI_VENDOR_ID_INTEL, &intel_switch_nvm_ops },
        { 0x8087, &intel_switch_nvm_ops },
 };