Hi Huacai,
I love your patch! Perhaps something to improve:
[auto build test WARNING on pci/next]
[also build test WARNING on linus/master v5.14-rc6 next-20210820]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url:
https://github.com/0day-ci/linux/commits/Huacai-Chen/PCI-VGA-Rework-defau...
base:
https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
config: arm-randconfig-c002-20210820 (attached as .config)
compiler: clang version 14.0.0 (
https://github.com/llvm/llvm-project
d9c5613e856cf2addfbf892fc4c1ce9ef9feceaa)
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O
~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm cross compiling tool for clang build
# apt-get install binutils-arm-linux-gnueabi
#
https://github.com/0day-ci/linux/commit/5a499ac0123cbe13fba8e3216dc81cf09...
git remote add linux-review
https://github.com/0day-ci/linux
git fetch --no-tags linux-review
Huacai-Chen/PCI-VGA-Rework-default-VGA-device-selection/20210820-181519
git checkout 5a499ac0123cbe13fba8e3216dc81cf09f59b101
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
^~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/block/pktcdvd.c:2214:6: note: Assuming 'flush' is 0
if (flush && pkt_flush_cache(pd))
^~~~~
drivers/block/pktcdvd.c:2214:12: note: Left side of '&&' is false
if (flush && pkt_flush_cache(pd))
^
drivers/block/pktcdvd.c:2219:2: note: Calling 'pkt_set_speed'
pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/block/pktcdvd.c:801:8: note: Calling 'pkt_generic_packet'
ret = pkt_generic_packet(pd, &cgc);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/block/pktcdvd.c:706:27: note: Assuming field 'data_direction' is not
equal to CGC_DATA_WRITE
rq = blk_get_request(q, (cgc->data_direction == CGC_DATA_WRITE) ?
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/block/pktcdvd.c:706:26: note: '?' condition is false
rq = blk_get_request(q, (cgc->data_direction == CGC_DATA_WRITE) ?
^
drivers/block/pktcdvd.c:708:2: note: Taking true branch
if (IS_ERR(rq))
^
drivers/block/pktcdvd.c:709:3: note: Returning without writing to
'cgc->sshdr', which participates in a condition later
return PTR_ERR(rq);
^
drivers/block/pktcdvd.c:801:8: note: Returning from 'pkt_generic_packet'
ret = pkt_generic_packet(pd, &cgc);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/block/pktcdvd.c:802:6: note: 'ret' is not equal to 0
if (ret)
^~~
drivers/block/pktcdvd.c:802:2: note: Taking true branch
if (ret)
^
drivers/block/pktcdvd.c:803:3: note: Calling 'pkt_dump_sense'
pkt_dump_sense(pd, &cgc);
^~~~~~~~~~~~~~~~~~~~~~~~
drivers/block/pktcdvd.c:753:6: note: 'sshdr' is non-null
if (sshdr)
^~~~~
drivers/block/pktcdvd.c:753:2: note: Taking true branch
if (sshdr)
^
drivers/block/pktcdvd.c:757:4: note: 1st function call argument is an uninitialized
value
sense_key_string(sshdr->sense_key));
^
drivers/block/pktcdvd.c:76:33: note: expanded from macro 'pkt_err'
pr_err("%s: " fmt, pd->name, ##__VA_ARGS__)
^~~~~~~~~~~
include/linux/printk.h:390:33: note: expanded from macro 'pr_err'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~~~~
drivers/block/pktcdvd.c:2723:2: warning: Call to function 'strcpy' is insecure
as it does not provide bounding of the memory buffer. Replace unbounded copy functions
with analogous functions that support length arguments such as 'strlcpy'. CWE-119
[clang-analyzer-security.insecureAPI.strcpy]
strcpy(disk->disk_name, pd->name);
^~~~~~
drivers/block/pktcdvd.c:2723:2: note: Call to function 'strcpy' is insecure as
it does not provide bounding of the memory buffer. Replace unbounded copy functions with
analogous functions that support length arguments such as 'strlcpy'. CWE-119
strcpy(disk->disk_name, pd->name);
^~~~~~
Suppressed 3 warnings (3 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
3 warnings generated.
Suppressed 3 warnings (3 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
3 warnings generated.
drivers/pci/ecam.c:62:2: warning: Value stored to 'bsz' is never read
[clang-analyzer-deadcode.DeadStores]
bsz = 1 << bus_shift;
^ ~~~~~~~~~~~~~~
drivers/pci/ecam.c:62:2: note: Value stored to 'bsz' is never read
bsz = 1 << bus_shift;
^ ~~~~~~~~~~~~~~
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
4 warnings generated.
> drivers/pci/vgaarb.c:245:17: warning: Value stored to
'dev' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
struct device *dev = &vgadev->pdev->dev;
^~~ ~~~~~~~~~~~~~~~~~~
drivers/pci/vgaarb.c:245:17: note: Value stored to 'dev' during its
initialization is never read
struct device *dev = &vgadev->pdev->dev;
^~~ ~~~~~~~~~~~~~~~~~~
drivers/pci/vgaarb.c:394:17: warning: Value stored to 'dev' during its
initialization is never read [clang-analyzer-deadcode.DeadStores]
struct device *dev = &vgadev->pdev->dev;
^~~ ~~~~~~~~~~~~~~~~~~
drivers/pci/vgaarb.c:394:17: note: Value stored to 'dev' during its
initialization is never read
struct device *dev = &vgadev->pdev->dev;
^~~ ~~~~~~~~~~~~~~~~~~
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use
-system-headers to display errors from system headers as well.
4 warnings generated.
fs/fat/fatent.c:482:2: warning: Value stored to 'err' is never read
[clang-analyzer-deadcode.DeadStores]
err = nr_bhs = idx_clus = 0;
^ ~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:482:2: note: Value stored to 'err' is never read
err = nr_bhs = idx_clus = 0;
^ ~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:684:18: warning: The left operand of '>=' is a garbage value
[clang-analyzer-core.UndefinedBinaryOperatorResult]
if (ra->ra_next >= ra->ra_limit)
^
fs/fat/fatent.c:777:14: note: Assuming '__UNIQUE_ID___x254' is <=
'__UNIQUE_ID___y255'
ent_start = max_t(u64, range->start>>sbi->cluster_bits,
FAT_START_ENT);
^
include/linux/minmax.h:112:27: note: expanded from macro 'max_t'
#define max_t(type, x, y) __careful_cmp((type)(x), (type)(y), >)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/minmax.h:38:3: note: expanded from macro '__careful_cmp'
__cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/minmax.h:33:3: note: expanded from macro '__cmp_once'
__cmp(unique_x, unique_y, op); })
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
#define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
^~~~~~~~~~
fs/fat/fatent.c:777:14: note: '?' condition is false
ent_start = max_t(u64, range->start>>sbi->cluster_bits,
FAT_START_ENT);
^
include/linux/minmax.h:112:27: note: expanded from macro 'max_t'
#define max_t(type, x, y) __careful_cmp((type)(x), (type)(y), >)
^
include/linux/minmax.h:38:3: note: expanded from macro '__careful_cmp'
__cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
^
include/linux/minmax.h:33:3: note: expanded from macro '__cmp_once'
__cmp(unique_x, unique_y, op); })
^
include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
#define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
^
fs/fat/fatent.c:781:6: note: Assuming 'ent_start' is < field
'max_cluster'
if (ent_start >= sbi->max_cluster || range->len <
sbi->cluster_size)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:781:6: note: Left side of '||' is false
fs/fat/fatent.c:781:39: note: Assuming field 'len' is >= field
'cluster_size'
if (ent_start >= sbi->max_cluster || range->len <
sbi->cluster_size)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:781:2: note: Taking false branch
if (ent_start >= sbi->max_cluster || range->len <
sbi->cluster_size)
^
fs/fat/fatent.c:783:6: note: Assuming 'ent_end' is < field
'max_cluster'
if (ent_end >= sbi->max_cluster)
^~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:783:2: note: Taking false branch
if (ent_end >= sbi->max_cluster)
^
fs/fat/fatent.c:789:2: note: Calling 'fat_ra_init'
fat_ra_init(sb, &fatent_ra, &fatent, ent_end + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:660:6: note: Assuming 'ent_limit' is <= field
'entry'
if (fatent->entry >= ent_limit)
^~~~~~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:660:2: note: Taking true branch
if (fatent->entry >= ent_limit)
^
fs/fat/fatent.c:661:3: note: Returning without writing to 'ra->ra_next'
return;
^
fs/fat/fatent.c:789:2: note: Returning from 'fat_ra_init'
fat_ra_init(sb, &fatent_ra, &fatent, ent_end + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:790:9: note: Assuming 'ent_end' is >= field 'entry'
while (fatent.entry <= ent_end) {
^~~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:790:2: note: Loop condition is true. Entering loop body
while (fatent.entry <= ent_end) {
^
fs/fat/fatent.c:792:3: note: Calling 'fat_ent_reada'
fat_ent_reada(sb, &fatent_ra, &fatent);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/fat/fatent.c:684:18: note: The left operand of '>=' is a garbage value
if (ra->ra_next >= ra->ra_limit)
~~~~~~~~~~~ ^
Suppressed 2 warnings (2 in non-user code).
vim +/dev +245 drivers/pci/vgaarb.c
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 241
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 242 static
struct vga_device *__vga_tryget(struct vga_device *vgadev,
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 243
unsigned int rsrc)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 244 {
a75d68f62106fe6 drivers/gpu/vga/vgaarb.c Bjorn Helgaas 2016-11-17 @245 struct
device *dev = &vgadev->pdev->dev;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 246 unsigned
int wants, legacy_wants, match;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 247 struct
vga_device *conflict;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 248 unsigned
int pci_bits;
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 249 u32
flags = 0;
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 250
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 251 /*
Account for "normal" resources to lock. If we decode the legacy,
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 252 *
counterpart, we need to request it as well
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 253 */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 254 if
((rsrc & VGA_RSRC_NORMAL_IO) &&
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 255
(vgadev->decodes & VGA_RSRC_LEGACY_IO))
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 256 rsrc |=
VGA_RSRC_LEGACY_IO;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 257 if
((rsrc & VGA_RSRC_NORMAL_MEM) &&
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 258
(vgadev->decodes & VGA_RSRC_LEGACY_MEM))
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 259 rsrc |=
VGA_RSRC_LEGACY_MEM;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 260
a75d68f62106fe6 drivers/gpu/vga/vgaarb.c Bjorn Helgaas 2016-11-17 261
vgaarb_dbg(dev, "%s: %d\n", __func__, rsrc);
a75d68f62106fe6 drivers/gpu/vga/vgaarb.c Bjorn Helgaas 2016-11-17 262
vgaarb_dbg(dev, "%s: owns: %d\n", __func__, vgadev->owns);
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 263
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 264 /* Check
what resources we need to acquire */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 265 wants =
rsrc & ~vgadev->owns;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 266
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 267 /* We
already own everything, just mark locked & bye bye */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 268 if
(wants == 0)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 269 goto
lock_them;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 270
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 271 /* We
don't need to request a legacy resource, we just enable
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 272 *
appropriate decoding and go
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 273 */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 274
legacy_wants = wants & VGA_RSRC_LEGACY_MASK;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 275 if
(legacy_wants == 0)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 276 goto
enable_them;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 277
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 278 /* Ok,
we don't, let's find out how we need to kick off */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 279
list_for_each_entry(conflict, &vga_list, list) {
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 280
unsigned int lwants = legacy_wants;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 281
unsigned int change_bridge = 0;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 282
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 283 /*
Don't conflict with myself */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 284 if
(vgadev == conflict)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 285
continue;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 286
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 287 /*
Check if the architecture allows a conflict between those
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 288 * 2
devices or if they are on separate domains
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 289 */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 290 if
(!vga_conflicts(vgadev->pdev, conflict->pdev))
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 291
continue;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 292
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 293 /* We
have a possible conflict. before we go further, we must
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 294 *
check if we sit on the same bus as the conflicting device.
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 295 * if
we don't, then we must tie both IO and MEM resources
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 296 *
together since there is only a single bit controlling
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 297 * VGA
forwarding on P2P bridges
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 298 */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 299 if
(vgadev->pdev->bus != conflict->pdev->bus) {
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 300
change_bridge = 1;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 301 lwants
= VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 302 }
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 303
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 304 /*
Check if the guy has a lock on the resource. If he does,
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 305 *
return the conflicting entry
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 306 */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 307 if
(conflict->locks & lwants)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 308 return
conflict;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 309
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 310 /* Ok,
now check if it owns the resource we want. We can
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 311 * lock
resources that are not decoded, therefore a device
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 312 * can
own resources it doesn't decode.
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 313 */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 314 match =
lwants & conflict->owns;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 315 if
(!match)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 316
continue;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 317
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 318 /*
looks like he doesn't have a lock, we can steal
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 319 * them
from him
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 320 */
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 321
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 322 flags =
0;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 323
pci_bits = 0;
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 324
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 325 /* If
we can't control legacy resources via the bridge, we
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 326 * also
need to disable normal decoding.
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 327 */
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 328 if
(!conflict->bridge_has_one_vga) {
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 329 if
((match & conflict->decodes) & VGA_RSRC_LEGACY_MEM)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 330
pci_bits |= PCI_COMMAND_MEMORY;
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 331 if
((match & conflict->decodes) & VGA_RSRC_LEGACY_IO)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 332
pci_bits |= PCI_COMMAND_IO;
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 333
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 334 if
(pci_bits) {
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 335
vga_irq_set_state(conflict, false);
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 336 flags
|= PCI_VGA_STATE_CHANGE_DECODES;
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 337 }
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 338 }
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 339
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 340 if
(change_bridge)
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 341 flags
|= PCI_VGA_STATE_CHANGE_BRIDGE;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 342
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 343
pci_set_vga_state(conflict->pdev, false, pci_bits, flags);
f22d776f3e280e6 drivers/gpu/vga/vgaarb.c Alex Williamson 2013-08-15 344
conflict->owns &= ~match;
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 345
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 346 /* If
we disabled normal decoding, reflect it in owns */
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 347 if
(pci_bits & PCI_COMMAND_MEMORY)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 348
conflict->owns &= ~VGA_RSRC_NORMAL_MEM;
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 349 if
(pci_bits & PCI_COMMAND_IO)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 350
conflict->owns &= ~VGA_RSRC_NORMAL_IO;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 351 }
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 352
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 353
enable_them:
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 354 /* ok
dude, we got it, everybody conflicting has been disabled, let's
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 355 *
enable us. Mark any bits in "owns" regardless of whether we
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 356 *
decoded them. We can lock resources we don't decode, therefore
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 357 * we
must track them via "owns".
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 358 */
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 359 flags =
0;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 360 pci_bits
= 0;
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 361
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 362 if
(!vgadev->bridge_has_one_vga) {
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 363 flags
|= PCI_VGA_STATE_CHANGE_DECODES;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 364 if
(wants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 365
pci_bits |= PCI_COMMAND_MEMORY;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 366 if
(wants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 367
pci_bits |= PCI_COMMAND_IO;
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 368 }
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 369 if
(wants & VGA_RSRC_LEGACY_MASK)
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 370 flags
|= PCI_VGA_STATE_CHANGE_BRIDGE;
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 371
3448a19da479b6b drivers/gpu/vga/vgaarb.c Dave Airlie 2010-06-01 372
pci_set_vga_state(vgadev->pdev, true, pci_bits, flags);
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 373
5d90ccf908bd806 drivers/gpu/vga/vgaarb.c Thierry Reding 2015-08-12 374 if
(!vgadev->bridge_has_one_vga)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 375
vga_irq_set_state(vgadev, true);
5d90ccf908bd806 drivers/gpu/vga/vgaarb.c Thierry Reding 2015-08-12 376
4e4e7dc55af5aa6 drivers/gpu/vga/vgaarb.c Alex Williamson 2014-07-03 377
vgadev->owns |= wants;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 378
lock_them:
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 379
vgadev->locks |= (rsrc & VGA_RSRC_LEGACY_MASK);
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 380 if (rsrc
& VGA_RSRC_LEGACY_IO)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 381
vgadev->io_lock_cnt++;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 382 if (rsrc
& VGA_RSRC_LEGACY_MEM)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 383
vgadev->mem_lock_cnt++;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 384 if (rsrc
& VGA_RSRC_NORMAL_IO)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 385
vgadev->io_norm_cnt++;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 386 if (rsrc
& VGA_RSRC_NORMAL_MEM)
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 387
vgadev->mem_norm_cnt++;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 388
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 389 return
NULL;
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 390 }
deb2d2ecd43dfc5 drivers/gpu/vga/vgaarb.c Benjamin Herrenschmidt 2009-08-11 391
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org