From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: drivers/vfio/pci/vfio_pci_igd.c:158:69: sparse: sparse: incorrect type in assignment (different base types)
Date: Mon, 30 Aug 2021 19:56:33 +0800 [thread overview]
Message-ID: <202108301927.PEFCsGSG-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 8190 bytes --]
tree: https://github.com/0day-ci/linux/commits/UPDATE-20210827-103812/Colin-Xu/vfio-pci-Add-OpRegion-2-0-Extended-VBT-support/20210813-101440
head: 52452f6e09eab566a6b475b09d9c2f7ce211c0b9
commit: 52452f6e09eab566a6b475b09d9c2f7ce211c0b9 vfio/pci: Add OpRegion 2.0 Extended VBT support.
date: 3 days ago
config: i386-randconfig-s001-20210830 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.3-348-gf0e6938b-dirty
# https://github.com/0day-ci/linux/commit/52452f6e09eab566a6b475b09d9c2f7ce211c0b9
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review UPDATE-20210827-103812/Colin-Xu/vfio-pci-Add-OpRegion-2-0-Extended-VBT-support/20210813-101440
git checkout 52452f6e09eab566a6b475b09d9c2f7ce211c0b9
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
sparse warnings: (new ones prefixed by >>)
>> drivers/vfio/pci/vfio_pci_igd.c:158:69: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] @@ got int @@
drivers/vfio/pci/vfio_pci_igd.c:158:69: sparse: expected restricted __le16 [usertype]
drivers/vfio/pci/vfio_pci_igd.c:158:69: sparse: got int
>> drivers/vfio/pci/vfio_pci_igd.c:160:66: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le64 [usertype] @@ got int @@
drivers/vfio/pci/vfio_pci_igd.c:160:66: sparse: expected restricted __le64 [usertype]
drivers/vfio/pci/vfio_pci_igd.c:160:66: sparse: got int
drivers/vfio/pci/vfio_pci_igd.c:232:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [addressable] [usertype] val @@ got restricted __le16 [usertype] @@
drivers/vfio/pci/vfio_pci_igd.c:232:21: sparse: expected unsigned short [addressable] [usertype] val
drivers/vfio/pci/vfio_pci_igd.c:232:21: sparse: got restricted __le16 [usertype]
drivers/vfio/pci/vfio_pci_igd.c:247:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [addressable] [usertype] val @@ got restricted __le32 [usertype] @@
drivers/vfio/pci/vfio_pci_igd.c:247:21: sparse: expected unsigned int [addressable] [usertype] val
drivers/vfio/pci/vfio_pci_igd.c:247:21: sparse: got restricted __le32 [usertype]
drivers/vfio/pci/vfio_pci_igd.c:262:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [addressable] [usertype] val @@ got restricted __le16 [usertype] @@
drivers/vfio/pci/vfio_pci_igd.c:262:21: sparse: expected unsigned short [addressable] [usertype] val
drivers/vfio/pci/vfio_pci_igd.c:262:21: sparse: got restricted __le16 [usertype]
vim +158 drivers/vfio/pci/vfio_pci_igd.c
61
62 static int vfio_pci_igd_opregion_init(struct vfio_pci_device *vdev)
63 {
64 __le32 *dwordp = (__le32 *)(vdev->vconfig + OPREGION_PCI_ADDR);
65 u32 addr, size, rvds = 0;
66 void *base, *opregionvbt;
67 int ret;
68 u16 version;
69 u64 rvda = 0;
70
71 ret = pci_read_config_dword(vdev->pdev, OPREGION_PCI_ADDR, &addr);
72 if (ret)
73 return ret;
74
75 if (!addr || !(~addr))
76 return -ENODEV;
77
78 base = memremap(addr, OPREGION_SIZE, MEMREMAP_WB);
79 if (!base)
80 return -ENOMEM;
81
82 if (memcmp(base, OPREGION_SIGNATURE, 16)) {
83 memunmap(base);
84 return -EINVAL;
85 }
86
87 size = le32_to_cpu(*(__le32 *)(base + 16));
88 if (!size) {
89 memunmap(base);
90 return -EINVAL;
91 }
92
93 size *= 1024; /* In KB */
94
95 /*
96 * OpRegion and VBT:
97 * When VBT data doesn't exceed 6KB, it's stored in Mailbox #4.
98 * When VBT data exceeds 6KB size, Mailbox #4 is no longer large enough
99 * to hold the VBT data, the Extended VBT region is introduced since
100 * OpRegion 2.0 to hold the VBT data. Since OpRegion 2.0, RVDA/RVDS are
101 * introduced to define the extended VBT data location and size.
102 * OpRegion 2.0: RVDA defines the absolute physical address of the
103 * extended VBT data, RVDS defines the VBT data size.
104 * OpRegion 2.1 and above: RVDA defines the relative address of the
105 * extended VBT data to OpRegion base, RVDS defines the VBT data size.
106 *
107 * Due to the RVDA difference in OpRegion VBT (also the only diff between
108 * 2.0 and 2.1), while for OpRegion 2.1 and above it's possible to map
109 * a contigious memory to expose OpRegion and VBT r/w via the vfio
110 * region, for OpRegion 2.0 shadow and amendment mechanism is used to
111 * expose OpRegion and VBT r/w properly. So that from r/w ops view, only
112 * OpRegion 2.1 is exposed regardless underneath Region is 2.0 or 2.1.
113 */
114 version = le16_to_cpu(*(__le16 *)(base + OPREGION_VERSION));
115
116 if (version >= 0x0200) {
117 rvda = le64_to_cpu(*(__le64 *)(base + OPREGION_RVDA));
118 rvds = le32_to_cpu(*(__le32 *)(base + OPREGION_RVDS));
119
120 /* The extended VBT must follows OpRegion for OpRegion 2.1+ */
121 if (rvda != size && version > 0x0200) {
122 memunmap(base);
123 pci_err(vdev->pdev,
124 "Extended VBT does not follow opregion on version 0x%04x\n",
125 version);
126 return -EINVAL;
127 }
128
129 /* The extended VBT is valid only when RVDA/RVDS are non-zero. */
130 if (rvda && rvds) {
131 size += rvds;
132 }
133 }
134
135 if (size != OPREGION_SIZE) {
136 /* Allocate memory for OpRegion and extended VBT for 2.0 */
137 if (rvda && rvds && version == 0x0200) {
138 void *vbt_base;
139
140 vbt_base = memremap(rvda, rvds, MEMREMAP_WB);
141 if (!vbt_base) {
142 memunmap(base);
143 return -ENOMEM;
144 }
145
146 opregionvbt = kzalloc(size, GFP_KERNEL);
147 if (!opregionvbt) {
148 memunmap(base);
149 memunmap(vbt_base);
150 return -ENOMEM;
151 }
152
153 /* Stitch VBT after OpRegion noncontigious */
154 memcpy(opregionvbt, base, OPREGION_SIZE);
155 memcpy(opregionvbt + OPREGION_SIZE, vbt_base, rvds);
156
157 /* Patch OpRegion 2.0 to 2.1 */
> 158 *(__le16 *)(opregionvbt + OPREGION_VERSION) = 0x0201;
159 /* Patch RVDA to relative address after OpRegion */
> 160 *(__le64 *)(opregionvbt + OPREGION_RVDA) = OPREGION_SIZE;
161
162 memunmap(vbt_base);
163 memunmap(base);
164
165 /* Register shadow instead of map as vfio_region */
166 base = opregionvbt;
167 /* Remap OpRegion + extended VBT for 2.1+ */
168 } else {
169 memunmap(base);
170 base = memremap(addr, size, MEMREMAP_WB);
171 if (!base)
172 return -ENOMEM;
173 }
174 }
175
176 ret = vfio_pci_register_dev_region(vdev,
177 PCI_VENDOR_ID_INTEL | VFIO_REGION_TYPE_PCI_VENDOR_TYPE,
178 VFIO_REGION_SUBTYPE_INTEL_IGD_OPREGION,
179 &vfio_pci_igd_regops, size, VFIO_REGION_INFO_FLAG_READ, base);
180 if (ret) {
181 if (is_ioremap_addr(base))
182 memunmap(base);
183 else
184 kfree(base);
185 return ret;
186 }
187
188 /* Fill vconfig with the hw value and virtualize register */
189 *dwordp = cpu_to_le32(addr);
190 memset(vdev->pci_config_map + OPREGION_PCI_ADDR,
191 PCI_CAP_ID_INVALID_VIRT, 4);
192
193 return ret;
194 }
195
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 36403 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Colin Xu <colin.xu@intel.com>
Cc: kbuild-all@lists.01.org, linux-kernel@vger.kernel.org,
0day robot <lkp@intel.com>
Subject: drivers/vfio/pci/vfio_pci_igd.c:158:69: sparse: sparse: incorrect type in assignment (different base types)
Date: Mon, 30 Aug 2021 19:56:33 +0800 [thread overview]
Message-ID: <202108301927.PEFCsGSG-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 8010 bytes --]
tree: https://github.com/0day-ci/linux/commits/UPDATE-20210827-103812/Colin-Xu/vfio-pci-Add-OpRegion-2-0-Extended-VBT-support/20210813-101440
head: 52452f6e09eab566a6b475b09d9c2f7ce211c0b9
commit: 52452f6e09eab566a6b475b09d9c2f7ce211c0b9 vfio/pci: Add OpRegion 2.0 Extended VBT support.
date: 3 days ago
config: i386-randconfig-s001-20210830 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.3-348-gf0e6938b-dirty
# https://github.com/0day-ci/linux/commit/52452f6e09eab566a6b475b09d9c2f7ce211c0b9
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review UPDATE-20210827-103812/Colin-Xu/vfio-pci-Add-OpRegion-2-0-Extended-VBT-support/20210813-101440
git checkout 52452f6e09eab566a6b475b09d9c2f7ce211c0b9
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
sparse warnings: (new ones prefixed by >>)
>> drivers/vfio/pci/vfio_pci_igd.c:158:69: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] @@ got int @@
drivers/vfio/pci/vfio_pci_igd.c:158:69: sparse: expected restricted __le16 [usertype]
drivers/vfio/pci/vfio_pci_igd.c:158:69: sparse: got int
>> drivers/vfio/pci/vfio_pci_igd.c:160:66: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le64 [usertype] @@ got int @@
drivers/vfio/pci/vfio_pci_igd.c:160:66: sparse: expected restricted __le64 [usertype]
drivers/vfio/pci/vfio_pci_igd.c:160:66: sparse: got int
drivers/vfio/pci/vfio_pci_igd.c:232:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [addressable] [usertype] val @@ got restricted __le16 [usertype] @@
drivers/vfio/pci/vfio_pci_igd.c:232:21: sparse: expected unsigned short [addressable] [usertype] val
drivers/vfio/pci/vfio_pci_igd.c:232:21: sparse: got restricted __le16 [usertype]
drivers/vfio/pci/vfio_pci_igd.c:247:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [addressable] [usertype] val @@ got restricted __le32 [usertype] @@
drivers/vfio/pci/vfio_pci_igd.c:247:21: sparse: expected unsigned int [addressable] [usertype] val
drivers/vfio/pci/vfio_pci_igd.c:247:21: sparse: got restricted __le32 [usertype]
drivers/vfio/pci/vfio_pci_igd.c:262:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned short [addressable] [usertype] val @@ got restricted __le16 [usertype] @@
drivers/vfio/pci/vfio_pci_igd.c:262:21: sparse: expected unsigned short [addressable] [usertype] val
drivers/vfio/pci/vfio_pci_igd.c:262:21: sparse: got restricted __le16 [usertype]
vim +158 drivers/vfio/pci/vfio_pci_igd.c
61
62 static int vfio_pci_igd_opregion_init(struct vfio_pci_device *vdev)
63 {
64 __le32 *dwordp = (__le32 *)(vdev->vconfig + OPREGION_PCI_ADDR);
65 u32 addr, size, rvds = 0;
66 void *base, *opregionvbt;
67 int ret;
68 u16 version;
69 u64 rvda = 0;
70
71 ret = pci_read_config_dword(vdev->pdev, OPREGION_PCI_ADDR, &addr);
72 if (ret)
73 return ret;
74
75 if (!addr || !(~addr))
76 return -ENODEV;
77
78 base = memremap(addr, OPREGION_SIZE, MEMREMAP_WB);
79 if (!base)
80 return -ENOMEM;
81
82 if (memcmp(base, OPREGION_SIGNATURE, 16)) {
83 memunmap(base);
84 return -EINVAL;
85 }
86
87 size = le32_to_cpu(*(__le32 *)(base + 16));
88 if (!size) {
89 memunmap(base);
90 return -EINVAL;
91 }
92
93 size *= 1024; /* In KB */
94
95 /*
96 * OpRegion and VBT:
97 * When VBT data doesn't exceed 6KB, it's stored in Mailbox #4.
98 * When VBT data exceeds 6KB size, Mailbox #4 is no longer large enough
99 * to hold the VBT data, the Extended VBT region is introduced since
100 * OpRegion 2.0 to hold the VBT data. Since OpRegion 2.0, RVDA/RVDS are
101 * introduced to define the extended VBT data location and size.
102 * OpRegion 2.0: RVDA defines the absolute physical address of the
103 * extended VBT data, RVDS defines the VBT data size.
104 * OpRegion 2.1 and above: RVDA defines the relative address of the
105 * extended VBT data to OpRegion base, RVDS defines the VBT data size.
106 *
107 * Due to the RVDA difference in OpRegion VBT (also the only diff between
108 * 2.0 and 2.1), while for OpRegion 2.1 and above it's possible to map
109 * a contigious memory to expose OpRegion and VBT r/w via the vfio
110 * region, for OpRegion 2.0 shadow and amendment mechanism is used to
111 * expose OpRegion and VBT r/w properly. So that from r/w ops view, only
112 * OpRegion 2.1 is exposed regardless underneath Region is 2.0 or 2.1.
113 */
114 version = le16_to_cpu(*(__le16 *)(base + OPREGION_VERSION));
115
116 if (version >= 0x0200) {
117 rvda = le64_to_cpu(*(__le64 *)(base + OPREGION_RVDA));
118 rvds = le32_to_cpu(*(__le32 *)(base + OPREGION_RVDS));
119
120 /* The extended VBT must follows OpRegion for OpRegion 2.1+ */
121 if (rvda != size && version > 0x0200) {
122 memunmap(base);
123 pci_err(vdev->pdev,
124 "Extended VBT does not follow opregion on version 0x%04x\n",
125 version);
126 return -EINVAL;
127 }
128
129 /* The extended VBT is valid only when RVDA/RVDS are non-zero. */
130 if (rvda && rvds) {
131 size += rvds;
132 }
133 }
134
135 if (size != OPREGION_SIZE) {
136 /* Allocate memory for OpRegion and extended VBT for 2.0 */
137 if (rvda && rvds && version == 0x0200) {
138 void *vbt_base;
139
140 vbt_base = memremap(rvda, rvds, MEMREMAP_WB);
141 if (!vbt_base) {
142 memunmap(base);
143 return -ENOMEM;
144 }
145
146 opregionvbt = kzalloc(size, GFP_KERNEL);
147 if (!opregionvbt) {
148 memunmap(base);
149 memunmap(vbt_base);
150 return -ENOMEM;
151 }
152
153 /* Stitch VBT after OpRegion noncontigious */
154 memcpy(opregionvbt, base, OPREGION_SIZE);
155 memcpy(opregionvbt + OPREGION_SIZE, vbt_base, rvds);
156
157 /* Patch OpRegion 2.0 to 2.1 */
> 158 *(__le16 *)(opregionvbt + OPREGION_VERSION) = 0x0201;
159 /* Patch RVDA to relative address after OpRegion */
> 160 *(__le64 *)(opregionvbt + OPREGION_RVDA) = OPREGION_SIZE;
161
162 memunmap(vbt_base);
163 memunmap(base);
164
165 /* Register shadow instead of map as vfio_region */
166 base = opregionvbt;
167 /* Remap OpRegion + extended VBT for 2.1+ */
168 } else {
169 memunmap(base);
170 base = memremap(addr, size, MEMREMAP_WB);
171 if (!base)
172 return -ENOMEM;
173 }
174 }
175
176 ret = vfio_pci_register_dev_region(vdev,
177 PCI_VENDOR_ID_INTEL | VFIO_REGION_TYPE_PCI_VENDOR_TYPE,
178 VFIO_REGION_SUBTYPE_INTEL_IGD_OPREGION,
179 &vfio_pci_igd_regops, size, VFIO_REGION_INFO_FLAG_READ, base);
180 if (ret) {
181 if (is_ioremap_addr(base))
182 memunmap(base);
183 else
184 kfree(base);
185 return ret;
186 }
187
188 /* Fill vconfig with the hw value and virtualize register */
189 *dwordp = cpu_to_le32(addr);
190 memset(vdev->pci_config_map + OPREGION_PCI_ADDR,
191 PCI_CAP_ID_INVALID_VIRT, 4);
192
193 return ret;
194 }
195
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 36403 bytes --]
next reply other threads:[~2021-08-30 11:56 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-30 11:56 kernel test robot [this message]
2021-08-30 11:56 ` drivers/vfio/pci/vfio_pci_igd.c:158:69: sparse: sparse: incorrect type in assignment (different base types) kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202108301927.PEFCsGSG-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild-all@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.