Merge 0ed9059756
("Merge branch 'random-5.17-rc1-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/crng/random") into android-mainline
Steps on the way to 5.17-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I5a5510c29e742eaa7294a42cb17e3fbb6043f3e4
This commit is contained in:
commit
0e82f74dc7
5
CREDITS
5
CREDITS
@ -315,6 +315,11 @@ S: Via Delle Palme, 9
|
||||
S: Terni 05100
|
||||
S: Italy
|
||||
|
||||
N: Ohad Ben Cohen
|
||||
E: ohad@wizery.com
|
||||
D: Remote Processor (remoteproc) subsystem
|
||||
D: Remote Processor Messaging (rpmsg) subsystem
|
||||
|
||||
N: Krzysztof Benedyczak
|
||||
E: golbi@mat.uni.torun.pl
|
||||
W: http://www.mat.uni.torun.pl/~golbi
|
||||
|
@ -41,14 +41,14 @@ KernelVersion: 5.6.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: The maximum number of groups can be created under this device.
|
||||
|
||||
What: /sys/bus/dsa/devices/dsa<m>/max_tokens
|
||||
Date: Oct 25, 2019
|
||||
KernelVersion: 5.6.0
|
||||
What: /sys/bus/dsa/devices/dsa<m>/max_read_buffers
|
||||
Date: Dec 10, 2021
|
||||
KernelVersion: 5.17.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: The total number of bandwidth tokens supported by this device.
|
||||
The bandwidth tokens represent resources within the DSA
|
||||
Description: The total number of read buffers supported by this device.
|
||||
The read buffers represent resources within the DSA
|
||||
implementation, and these resources are allocated by engines to
|
||||
support operations.
|
||||
support operations. See DSA spec v1.2 9.2.4 Total Read Buffers.
|
||||
|
||||
What: /sys/bus/dsa/devices/dsa<m>/max_transfer_size
|
||||
Date: Oct 25, 2019
|
||||
@ -115,13 +115,13 @@ KernelVersion: 5.6.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: To indicate if this device is configurable or not.
|
||||
|
||||
What: /sys/bus/dsa/devices/dsa<m>/token_limit
|
||||
Date: Oct 25, 2019
|
||||
KernelVersion: 5.6.0
|
||||
What: /sys/bus/dsa/devices/dsa<m>/read_buffer_limit
|
||||
Date: Dec 10, 2021
|
||||
KernelVersion: 5.17.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: The maximum number of bandwidth tokens that may be in use at
|
||||
Description: The maximum number of read buffers that may be in use at
|
||||
one time by operations that access low bandwidth memory in the
|
||||
device.
|
||||
device. See DSA spec v1.2 9.2.8 GENCFG on Global Read Buffer Limit.
|
||||
|
||||
What: /sys/bus/dsa/devices/dsa<m>/cmd_status
|
||||
Date: Aug 28, 2020
|
||||
@ -220,8 +220,38 @@ Contact: dmaengine@vger.kernel.org
|
||||
Description: Show the current number of entries in this WQ if WQ Occupancy
|
||||
Support bit WQ capabilities is 1.
|
||||
|
||||
What: /sys/bus/dsa/devices/wq<m>.<n>/enqcmds_retries
|
||||
Date Oct 29, 2021
|
||||
KernelVersion: 5.17.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: Indicate the number of retires for an enqcmds submission on a sharedwq.
|
||||
A max value to set attribute is capped at 64.
|
||||
|
||||
What: /sys/bus/dsa/devices/engine<m>.<n>/group_id
|
||||
Date: Oct 25, 2019
|
||||
KernelVersion: 5.6.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: The group that this engine belongs to.
|
||||
|
||||
What: /sys/bus/dsa/devices/group<m>.<n>/use_read_buffer_limit
|
||||
Date: Dec 10, 2021
|
||||
KernelVersion: 5.17.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: Enable the use of global read buffer limit for the group. See DSA
|
||||
spec v1.2 9.2.18 GRPCFG Use Global Read Buffer Limit.
|
||||
|
||||
What: /sys/bus/dsa/devices/group<m>.<n>/read_buffers_allowed
|
||||
Date: Dec 10, 2021
|
||||
KernelVersion: 5.17.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: Indicates max number of read buffers that may be in use at one time
|
||||
by all engines in the group. See DSA spec v1.2 9.2.18 GRPCFG Read
|
||||
Buffers Allowed.
|
||||
|
||||
What: /sys/bus/dsa/devices/group<m>.<n>/read_buffers_reserved
|
||||
Date: Dec 10, 2021
|
||||
KernelVersion: 5.17.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: Indicates the number of Read Buffers reserved for the use of
|
||||
engines in the group. See DSA spec v1.2 9.2.18 GRPCFG Read Buffers
|
||||
Reserved.
|
||||
|
57
Documentation/ABI/testing/sysfs-bus-vdpa
Normal file
57
Documentation/ABI/testing/sysfs-bus-vdpa
Normal file
@ -0,0 +1,57 @@
|
||||
What: /sys/bus/vdpa/driver_autoprobe
|
||||
Date: March 2020
|
||||
Contact: virtualization@lists.linux-foundation.org
|
||||
Description:
|
||||
This file determines whether new devices are immediately bound
|
||||
to a driver after the creation. It initially contains 1, which
|
||||
means the kernel automatically binds devices to a compatible
|
||||
driver immediately after they are created.
|
||||
|
||||
Writing "0" to this file disable this feature, any other string
|
||||
enable it.
|
||||
|
||||
What: /sys/bus/vdpa/driver_probe
|
||||
Date: March 2020
|
||||
Contact: virtualization@lists.linux-foundation.org
|
||||
Description:
|
||||
Writing a device name to this file will cause the kernel binds
|
||||
devices to a compatible driver.
|
||||
|
||||
This can be useful when /sys/bus/vdpa/driver_autoprobe is
|
||||
disabled.
|
||||
|
||||
What: /sys/bus/vdpa/drivers/.../bind
|
||||
Date: March 2020
|
||||
Contact: virtualization@lists.linux-foundation.org
|
||||
Description:
|
||||
Writing a device name to this file will cause the driver to
|
||||
attempt to bind to the device. This is useful for overriding
|
||||
default bindings.
|
||||
|
||||
What: /sys/bus/vdpa/drivers/.../unbind
|
||||
Date: March 2020
|
||||
Contact: virtualization@lists.linux-foundation.org
|
||||
Description:
|
||||
Writing a device name to this file will cause the driver to
|
||||
attempt to unbind from the device. This may be useful when
|
||||
overriding default bindings.
|
||||
|
||||
What: /sys/bus/vdpa/devices/.../driver_override
|
||||
Date: November 2021
|
||||
Contact: virtualization@lists.linux-foundation.org
|
||||
Description:
|
||||
This file allows the driver for a device to be specified.
|
||||
When specified, only a driver with a name matching the value
|
||||
written to driver_override will have an opportunity to bind to
|
||||
the device. The override is specified by writing a string to the
|
||||
driver_override file (echo vhost-vdpa > driver_override) and may
|
||||
be cleared with an empty string (echo > driver_override).
|
||||
This returns the device to standard matching rules binding.
|
||||
Writing to driver_override does not automatically unbind the
|
||||
device from its current driver or make any attempt to
|
||||
automatically load the specified driver. If no driver with a
|
||||
matching name is currently loaded in the kernel, the device will
|
||||
not bind to any driver. This also allows devices to opt-out of
|
||||
driver binding using a driver_override name such as "none".
|
||||
Only a single driver may be specified in the override, there is
|
||||
no support for parsing delimiters.
|
83
Documentation/devicetree/bindings/dma/arm,pl330.yaml
Normal file
83
Documentation/devicetree/bindings/dma/arm,pl330.yaml
Normal file
@ -0,0 +1,83 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/dma/arm,pl330.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: ARM PrimeCell PL330 DMA Controller
|
||||
|
||||
maintainers:
|
||||
- Vinod Koul <vkoul@kernel.org>
|
||||
|
||||
description:
|
||||
The ARM PrimeCell PL330 DMA controller can move blocks of memory contents
|
||||
between memory and peripherals or memory to memory.
|
||||
|
||||
# We need a select here so we don't match all nodes with 'arm,primecell'
|
||||
select:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: arm,pl330
|
||||
required:
|
||||
- compatible
|
||||
|
||||
allOf:
|
||||
- $ref: dma-controller.yaml#
|
||||
- $ref: /schemas/arm/primecell.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- arm,pl330
|
||||
- const: arm,primecell
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
minItems: 1
|
||||
maxItems: 32
|
||||
description: A single combined interrupt or an interrupt per event
|
||||
|
||||
'#dma-cells':
|
||||
const: 1
|
||||
description: Contains the DMA request number for the consumer
|
||||
|
||||
arm,pl330-broken-no-flushp:
|
||||
type: boolean
|
||||
description: quirk for avoiding to execute DMAFLUSHP
|
||||
|
||||
arm,pl330-periph-burst:
|
||||
type: boolean
|
||||
description: quirk for performing burst transfer only
|
||||
|
||||
dma-coherent: true
|
||||
|
||||
resets:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
reset-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: dma
|
||||
- const: dma-ocp
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
dma-controller@12680000 {
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x12680000 0x1000>;
|
||||
interrupts = <99>;
|
||||
#dma-cells = <1>;
|
||||
};
|
||||
...
|
@ -10,6 +10,7 @@ maintainers:
|
||||
- Vinod Koul <vkoul@kernel.org>
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/arm/primecell.yaml#
|
||||
- $ref: "dma-controller.yaml#"
|
||||
|
||||
# We need a select here so we don't match all nodes with 'arm,primecell'
|
||||
@ -89,6 +90,9 @@ properties:
|
||||
- 64
|
||||
description: bus width used for memcpy in bits. FTDMAC020 also accept 64 bits
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
- interrupts
|
||||
|
@ -1,49 +0,0 @@
|
||||
* ARM PrimeCell PL330 DMA Controller
|
||||
|
||||
The ARM PrimeCell PL330 DMA controller can move blocks of memory contents
|
||||
between memory and peripherals or memory to memory.
|
||||
|
||||
Required properties:
|
||||
- compatible: should include both "arm,pl330" and "arm,primecell".
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- interrupts: interrupt number to the cpu.
|
||||
|
||||
Optional properties:
|
||||
- dma-coherent : Present if dma operations are coherent
|
||||
- #dma-cells: must be <1>. used to represent the number of integer
|
||||
cells in the dmas property of client device.
|
||||
- dma-channels: contains the total number of DMA channels supported by the DMAC
|
||||
- dma-requests: contains the total number of DMA requests supported by the DMAC
|
||||
- arm,pl330-broken-no-flushp: quirk for avoiding to execute DMAFLUSHP
|
||||
- arm,pl330-periph-burst: quirk for performing burst transfer only
|
||||
- resets: contains an entry for each entry in reset-names.
|
||||
See ../reset/reset.txt for details.
|
||||
- reset-names: must contain at least "dma", and optional is "dma-ocp".
|
||||
|
||||
Example:
|
||||
|
||||
pdma0: pdma@12680000 {
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x12680000 0x1000>;
|
||||
interrupts = <99>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <32>;
|
||||
};
|
||||
|
||||
Client drivers (device nodes requiring dma transfers from dev-to-mem or
|
||||
mem-to-dev) should specify the DMA channel numbers and dma channel names
|
||||
as shown below.
|
||||
|
||||
[property name] = <[phandle of the dma controller] [dma request id]>;
|
||||
[property name] = <[dma channel name]>
|
||||
|
||||
where 'dma request id' is the dma request number which is connected
|
||||
to the client controller. The 'property name' 'dmas' and 'dma-names'
|
||||
as required by the generic dma device tree binding helpers. The dma
|
||||
names correspond 1:1 with the dma request ids in the dmas property.
|
||||
|
||||
Example: dmas = <&pdma0 12
|
||||
&pdma1 11>;
|
||||
dma-names = "tx", "rx";
|
@ -24,10 +24,10 @@ examples:
|
||||
dma: dma-controller@48000000 {
|
||||
compatible = "ti,omap-sdma";
|
||||
reg = <0x48000000 0x1000>;
|
||||
interrupts = <0 12 0x4
|
||||
0 13 0x4
|
||||
0 14 0x4
|
||||
0 15 0x4>;
|
||||
interrupts = <0 12 0x4>,
|
||||
<0 13 0x4>,
|
||||
<0 14 0x4>,
|
||||
<0 15 0x4>;
|
||||
#dma-cells = <1>;
|
||||
dma-channels = <32>;
|
||||
dma-requests = <127>;
|
||||
|
@ -14,15 +14,23 @@ allOf:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- ingenic,jz4740-dma
|
||||
- ingenic,jz4725b-dma
|
||||
- ingenic,jz4760-dma
|
||||
- ingenic,jz4760b-dma
|
||||
- ingenic,jz4770-dma
|
||||
- ingenic,jz4780-dma
|
||||
- ingenic,x1000-dma
|
||||
- ingenic,x1830-dma
|
||||
oneOf:
|
||||
- enum:
|
||||
- ingenic,jz4740-dma
|
||||
- ingenic,jz4725b-dma
|
||||
- ingenic,jz4760-dma
|
||||
- ingenic,jz4760-bdma
|
||||
- ingenic,jz4760-mdma
|
||||
- ingenic,jz4760b-dma
|
||||
- ingenic,jz4760b-bdma
|
||||
- ingenic,jz4760b-mdma
|
||||
- ingenic,jz4770-dma
|
||||
- ingenic,jz4780-dma
|
||||
- ingenic,x1000-dma
|
||||
- ingenic,x1830-dma
|
||||
- items:
|
||||
- const: ingenic,jz4770-bdma
|
||||
- const: ingenic,jz4760b-bdma
|
||||
|
||||
reg:
|
||||
items:
|
||||
@ -36,13 +44,19 @@ properties:
|
||||
maxItems: 1
|
||||
|
||||
"#dma-cells":
|
||||
const: 2
|
||||
enum: [2, 3]
|
||||
description: >
|
||||
DMA clients must use the format described in dma.txt, giving a phandle
|
||||
to the DMA controller plus the following 2 integer cells:
|
||||
to the DMA controller plus the following integer cells:
|
||||
|
||||
- Request type: The DMA request type for transfers to/from the
|
||||
device on the allocated channel, as defined in the SoC documentation.
|
||||
- Request type: The DMA request type specifies the device endpoint that
|
||||
will be the source or destination of the DMA transfer.
|
||||
If "#dma-cells" is 2, the request type is a single cell, and the
|
||||
direction will be unidirectional (either RX or TX but not both).
|
||||
If "#dma-cells" is 3, the request type has two cells; the first
|
||||
one corresponds to the host to device direction (TX), the second one
|
||||
corresponds to the device to host direction (RX). The DMA channel is
|
||||
then bidirectional.
|
||||
|
||||
- Channel: If set to 0xffffffff, any available channel will be allocated
|
||||
for the client. Otherwise, the exact channel specified will be used.
|
||||
|
@ -44,6 +44,10 @@ properties:
|
||||
- items:
|
||||
- const: renesas,dmac-r8a779a0 # R-Car V3U
|
||||
|
||||
- items:
|
||||
- const: renesas,dmac-r8a779f0 # R-Car S4-8
|
||||
- const: renesas,rcar-gen4-dmac
|
||||
|
||||
reg: true
|
||||
|
||||
interrupts:
|
||||
@ -118,6 +122,7 @@ if:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,dmac-r8a779a0
|
||||
- renesas,rcar-gen4-dmac
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
|
@ -53,6 +53,9 @@ properties:
|
||||
minimum: 1
|
||||
maximum: 8
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
snps,dma-masters:
|
||||
description: |
|
||||
Number of AXI masters supported by the hardware.
|
||||
|
@ -30,6 +30,7 @@ description: |
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/dma/dma-controller.yaml#
|
||||
- $ref: /schemas/arm/keystone/ti,k3-sci-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
@ -25,6 +25,7 @@ description: |
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/dma/dma-controller.yaml#
|
||||
- $ref: /schemas/arm/keystone/ti,k3-sci-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
@ -0,0 +1,115 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/input/touchscreen/zinitix,bt400.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Zinitix BT4xx and BT5xx series touchscreen controller bindings
|
||||
|
||||
description: The Zinitix BT4xx and BT5xx series of touchscreen controllers
|
||||
are Korea-produced touchscreens with embedded microcontrollers. The
|
||||
BT4xx series was produced 2010-2013 and the BT5xx series 2013-2014.
|
||||
|
||||
maintainers:
|
||||
- Michael Srba <Michael.Srba@seznam.cz>
|
||||
- Linus Walleij <linus.walleij@linaro.org>
|
||||
|
||||
allOf:
|
||||
- $ref: touchscreen.yaml#
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
pattern: "^touchscreen(@.*)?$"
|
||||
|
||||
compatible:
|
||||
enum:
|
||||
- zinitix,bt402
|
||||
- zinitix,bt403
|
||||
- zinitix,bt404
|
||||
- zinitix,bt412
|
||||
- zinitix,bt413
|
||||
- zinitix,bt431
|
||||
- zinitix,bt432
|
||||
- zinitix,bt531
|
||||
- zinitix,bt532
|
||||
- zinitix,bt538
|
||||
- zinitix,bt541
|
||||
- zinitix,bt548
|
||||
- zinitix,bt554
|
||||
- zinitix,at100
|
||||
|
||||
reg:
|
||||
description: I2C address on the I2C bus
|
||||
|
||||
clock-frequency:
|
||||
description: I2C client clock frequency, defined for host when using
|
||||
the device on the I2C bus
|
||||
minimum: 0
|
||||
maximum: 400000
|
||||
|
||||
interrupts:
|
||||
description: Interrupt to host
|
||||
maxItems: 1
|
||||
|
||||
vcca-supply:
|
||||
description: Analog power supply regulator on the VCCA pin
|
||||
|
||||
vdd-supply:
|
||||
description: Digital power supply regulator on the VDD pin.
|
||||
In older device trees this can be the accidental name for the analog
|
||||
supply on the VCCA pin, and in that case the deprecated vddo-supply is
|
||||
used for the digital power supply.
|
||||
|
||||
vddo-supply:
|
||||
description: Deprecated name for the digital power supply, use vdd-supply
|
||||
as this reflects the real name of the pin. If this supply is present,
|
||||
the vdd-supply represents VCCA instead of VDD. Implementers should first
|
||||
check for this property, and if it is present assume that the vdd-supply
|
||||
represents the analog supply.
|
||||
deprecated: true
|
||||
|
||||
reset-gpios:
|
||||
description: Reset line for the touchscreen, should be tagged
|
||||
as GPIO_ACTIVE_LOW
|
||||
|
||||
zinitix,mode:
|
||||
description: Mode of reporting touch points. Some modes may not work
|
||||
with a particular ts firmware for unknown reasons. Available modes are
|
||||
1 and 2. Mode 2 is the default and preferred.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [1, 2]
|
||||
|
||||
touchscreen-size-x: true
|
||||
touchscreen-size-y: true
|
||||
touchscreen-fuzz-x: true
|
||||
touchscreen-fuzz-y: true
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- touchscreen-size-x
|
||||
- touchscreen-size-y
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
touchscreen@20 {
|
||||
compatible = "zinitix,bt541";
|
||||
reg = <0x20>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
|
||||
vcca-supply = <®_vcca_tsp>;
|
||||
vdd-supply = <®_vdd_tsp>;
|
||||
touchscreen-size-x = <540>;
|
||||
touchscreen-size-y = <960>;
|
||||
zinitix,mode = <2>;
|
||||
};
|
||||
};
|
@ -1,40 +0,0 @@
|
||||
Device tree bindings for Zinitx BT541 touchscreen controller
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : Should be "zinitix,bt541"
|
||||
- reg : I2C address of the chip. Should be 0x20
|
||||
- interrupts : Interrupt to which the chip is connected
|
||||
|
||||
Optional properties:
|
||||
|
||||
- vdd-supply : Analog power supply regulator on VCCA pin
|
||||
- vddo-supply : Digital power supply regulator on VDD pin
|
||||
- zinitix,mode : Mode of reporting touch points. Some modes may not work
|
||||
with a particular ts firmware for unknown reasons. Available
|
||||
modes are 1 and 2. Mode 2 is the default and preferred.
|
||||
|
||||
The touchscreen-* properties are documented in touchscreen.txt in this
|
||||
directory.
|
||||
|
||||
Example:
|
||||
|
||||
i2c@00000000 {
|
||||
/* ... */
|
||||
|
||||
bt541@20 {
|
||||
compatible = "zinitix,bt541";
|
||||
reg = <0x20>;
|
||||
interrupt-parent = <&msmgpio>;
|
||||
interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&tsp_default>;
|
||||
vdd-supply = <®_vdd_tsp>;
|
||||
vddo-supply = <&pm8916_l6>;
|
||||
touchscreen-size-x = <540>;
|
||||
touchscreen-size-y = <960>;
|
||||
zinitix,mode = <2>;
|
||||
};
|
||||
|
||||
/* ... */
|
||||
};
|
@ -33,6 +33,9 @@ properties:
|
||||
- qcom,sdm845-adsp-pas
|
||||
- qcom,sdm845-cdsp-pas
|
||||
- qcom,sdx55-mpss-pas
|
||||
- qcom,sm6350-adsp-pas
|
||||
- qcom,sm6350-cdsp-pas
|
||||
- qcom,sm6350-mpss-pas
|
||||
- qcom,sm8150-adsp-pas
|
||||
- qcom,sm8150-cdsp-pas
|
||||
- qcom,sm8150-mpss-pas
|
||||
@ -158,6 +161,9 @@ allOf:
|
||||
- qcom,sc8180x-mpss-pas
|
||||
- qcom,sdm845-adsp-pas
|
||||
- qcom,sdm845-cdsp-pas
|
||||
- qcom,sm6350-adsp-pas
|
||||
- qcom,sm6350-cdsp-pas
|
||||
- qcom,sm6350-mpss-pas
|
||||
- qcom,sm8150-adsp-pas
|
||||
- qcom,sm8150-cdsp-pas
|
||||
- qcom,sm8150-mpss-pas
|
||||
@ -266,6 +272,8 @@ allOf:
|
||||
- qcom,sc8180x-cdsp-pas
|
||||
- qcom,sdm845-adsp-pas
|
||||
- qcom,sdm845-cdsp-pas
|
||||
- qcom,sm6350-adsp-pas
|
||||
- qcom,sm6350-cdsp-pas
|
||||
- qcom,sm8150-adsp-pas
|
||||
- qcom,sm8150-cdsp-pas
|
||||
- qcom,sm8150-slpi-pas
|
||||
@ -301,6 +309,7 @@ allOf:
|
||||
- qcom,sc7280-mpss-pas
|
||||
- qcom,sc8180x-mpss-pas
|
||||
- qcom,sdx55-mpss-pas
|
||||
- qcom,sm6350-mpss-pas
|
||||
- qcom,sm8150-mpss-pas
|
||||
- qcom,sm8350-mpss-pas
|
||||
then:
|
||||
@ -385,6 +394,23 @@ allOf:
|
||||
- const: mx
|
||||
- const: mss
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,sm6350-cdsp-pas
|
||||
then:
|
||||
properties:
|
||||
power-domains:
|
||||
items:
|
||||
- description: CX power domain
|
||||
- description: MX power domain
|
||||
power-domain-names:
|
||||
items:
|
||||
- const: cx
|
||||
- const: mx
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
@ -405,6 +431,7 @@ allOf:
|
||||
enum:
|
||||
- qcom,sc7280-mpss-pas
|
||||
- qcom,sdx55-mpss-pas
|
||||
- qcom,sm6350-mpss-pas
|
||||
- qcom,sm8150-mpss-pas
|
||||
- qcom,sm8350-mpss-pas
|
||||
then:
|
||||
@ -425,6 +452,7 @@ allOf:
|
||||
enum:
|
||||
- qcom,sc8180x-adsp-pas
|
||||
- qcom,sc8180x-cdsp-pas
|
||||
- qcom,sm6350-adsp-pas
|
||||
- qcom,sm8150-slpi-pas
|
||||
- qcom,sm8250-adsp-pas
|
||||
- qcom,sm8250-slpi-pas
|
||||
|
@ -0,0 +1,65 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/remoteproc/renesas,rcar-rproc.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Renesas R-Car remote processor controller bindings
|
||||
|
||||
maintainers:
|
||||
- Julien Massot <julien.massot@iot.bzh>
|
||||
|
||||
description: |
|
||||
This document defines the bindings for the remoteproc component that loads and
|
||||
boots firmwares on the Renesas R-Car family chipset.
|
||||
R-Car gen3 family may have a realtime processor, this processor shares peripheral
|
||||
and RAM with the host processor with the same address map.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: renesas,rcar-cr7
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
memory-region:
|
||||
description:
|
||||
List of phandles to the reserved memory regions associated with the
|
||||
remoteproc device. This is variable and describes the memories shared with
|
||||
the remote processor (e.g. remoteproc firmware and carveouts, rpmsg
|
||||
vrings, ...).
|
||||
(see ../reserved-memory/reserved-memory.yaml)
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- resets
|
||||
- memory-region
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/r8a7795-cpg-mssr.h>
|
||||
#include <dt-bindings/power/r8a7795-sysc.h>
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
cr7_ram: cr7_ram@40040000 {
|
||||
no-map;
|
||||
reg = <0x0 0x40040000 0x0 0x1fc0000>;
|
||||
};
|
||||
};
|
||||
|
||||
cr7_rproc: cr7 {
|
||||
compatible = "renesas,rcar-cr7";
|
||||
memory-region = <&cr7_ram>;
|
||||
power-domains = <&sysc R8A7795_PD_CR7>;
|
||||
resets = <&cpg 222>;
|
||||
};
|
||||
|
||||
...
|
@ -33,9 +33,11 @@ properties:
|
||||
enum:
|
||||
- ti,j721e-c66-dsp
|
||||
- ti,j721e-c71-dsp
|
||||
- ti,j721s2-c71-dsp
|
||||
description:
|
||||
Use "ti,j721e-c66-dsp" for C66x DSPs on K3 J721E SoCs
|
||||
Use "ti,j721e-c71-dsp" for C71x DSPs on K3 J721E SoCs
|
||||
Use "ti,j721s2-c71-dsp" for C71x DSPs on K3 J721S2 SoCs
|
||||
|
||||
resets:
|
||||
description: |
|
||||
@ -106,6 +108,7 @@ else:
|
||||
compatible:
|
||||
enum:
|
||||
- ti,j721e-c71-dsp
|
||||
- ti,j721s2-c71-dsp
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
|
@ -38,6 +38,7 @@ properties:
|
||||
- ti,j721e-r5fss
|
||||
- ti,j7200-r5fss
|
||||
- ti,am64-r5fss
|
||||
- ti,j721s2-r5fss
|
||||
|
||||
power-domains:
|
||||
description: |
|
||||
@ -64,9 +65,9 @@ properties:
|
||||
description: |
|
||||
Configuration Mode for the Dual R5F cores within the R5F cluster.
|
||||
Should be either a value of 1 (LockStep mode) or 0 (Split mode) on
|
||||
most SoCs (AM65x, J721E, J7200), default is LockStep mode if omitted;
|
||||
and should be either a value of 0 (Split mode) or 2 (Single-CPU mode)
|
||||
on AM64x SoCs, default is Split mode if omitted.
|
||||
most SoCs (AM65x, J721E, J7200, J721s2), default is LockStep mode if
|
||||
omitted; and should be either a value of 0 (Split mode) or 2
|
||||
(Single-CPU mode) on AM64x SoCs, default is Split mode if omitted.
|
||||
|
||||
# R5F Processor Child Nodes:
|
||||
# ==========================
|
||||
@ -104,6 +105,7 @@ patternProperties:
|
||||
- ti,j721e-r5f
|
||||
- ti,j7200-r5f
|
||||
- ti,am64-r5f
|
||||
- ti,j721s2-r5f
|
||||
|
||||
reg:
|
||||
items:
|
||||
|
@ -1,19 +0,0 @@
|
||||
BCM7038 Watchdog timer
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be "brcm,bcm7038-wdt"
|
||||
- reg : Specifies base physical address and size of the registers.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- clocks: The clock running the watchdog. If no clock is found the
|
||||
driver will default to 27000000 Hz.
|
||||
|
||||
Example:
|
||||
|
||||
watchdog@f040a7e8 {
|
||||
compatible = "brcm,bcm7038-wdt";
|
||||
clocks = <&upg_fixed>;
|
||||
reg = <0xf040a7e8 0x16>;
|
||||
};
|
@ -0,0 +1,43 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/watchdog/brcm,bcm7038-wdt.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: BCM63xx and BCM7038 watchdog timer
|
||||
|
||||
allOf:
|
||||
- $ref: "watchdog.yaml#"
|
||||
|
||||
maintainers:
|
||||
- Florian Fainelli <f.fainelli@gmail.com>
|
||||
- Justin Chen <justinpopo6@gmail.com>
|
||||
- Rafał Miłecki <rafal@milecki.pl>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- brcm,bcm6345-wdt
|
||||
- brcm,bcm7038-wdt
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
description: >
|
||||
The clock running the watchdog. If no clock is found the driver will
|
||||
default to 27000000 Hz.
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
- reg
|
||||
|
||||
examples:
|
||||
- |
|
||||
watchdog@f040a7e8 {
|
||||
compatible = "brcm,bcm7038-wdt";
|
||||
reg = <0xf040a7e8 0x16>;
|
||||
clocks = <&upg_fixed>;
|
||||
};
|
@ -14,8 +14,11 @@ allOf:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- fsl,imx7ulp-wdt
|
||||
oneOf:
|
||||
- const: fsl,imx7ulp-wdt
|
||||
- items:
|
||||
- const: fsl,imx8ulp-wdt
|
||||
- const: fsl,imx7ulp-wdt
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -20,7 +20,9 @@ properties:
|
||||
- qcom,apss-wdt-sc7280
|
||||
- qcom,apss-wdt-sdm845
|
||||
- qcom,apss-wdt-sdx55
|
||||
- qcom,apss-wdt-sm6350
|
||||
- qcom,apss-wdt-sm8150
|
||||
- qcom,apss-wdt-sm8250
|
||||
- qcom,kpss-timer
|
||||
- qcom,kpss-wdt
|
||||
- qcom,kpss-wdt-apq8064
|
||||
|
@ -0,0 +1,91 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/watchdog/realtek,otto-wdt.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Realtek Otto watchdog timer
|
||||
|
||||
maintainers:
|
||||
- Sander Vanheule <sander@svanheule.net>
|
||||
|
||||
description: |
|
||||
The timer has two timeout phases. Both phases have a maximum duration of 32
|
||||
prescaled clock ticks, which is ca. 43s with a bus clock of 200MHz. The
|
||||
minimum duration of each phase is one tick. Each phase can trigger an
|
||||
interrupt, although the phase 2 interrupt will occur with the system reset.
|
||||
- Phase 1: During this phase, the WDT can be pinged to reset the timeout.
|
||||
- Phase 2: Starts after phase 1 has timed out, and only serves to give the
|
||||
system some time to clean up, or notify others that it's going to reset.
|
||||
During this phase, pinging the WDT has no effect, and a reset is
|
||||
unavoidable, unless the WDT is disabled.
|
||||
|
||||
allOf:
|
||||
- $ref: watchdog.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- realtek,rtl8380-wdt
|
||||
- realtek,rtl8390-wdt
|
||||
- realtek,rtl9300-wdt
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
items:
|
||||
- description: interrupt specifier for pretimeout
|
||||
- description: interrupt specifier for timeout
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: phase1
|
||||
- const: phase2
|
||||
|
||||
realtek,reset-mode:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description: |
|
||||
Specify how the system is reset after a timeout. Defaults to "cpu" if
|
||||
left unspecified.
|
||||
oneOf:
|
||||
- description: Reset the entire chip
|
||||
const: soc
|
||||
- description: |
|
||||
Reset the CPU and IPsec engine, but leave other peripherals untouched
|
||||
const: cpu
|
||||
- description: |
|
||||
Reset the execution pointer, but don't actually reset any hardware
|
||||
const: software
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- interrupts
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
dependencies:
|
||||
interrupts: [ interrupt-names ]
|
||||
|
||||
examples:
|
||||
- |
|
||||
watchdog: watchdog@3150 {
|
||||
compatible = "realtek,rtl8380-wdt";
|
||||
reg = <0x3150 0xc>;
|
||||
|
||||
realtek,reset-mode = "soc";
|
||||
|
||||
clocks = <&lxbus_clock>;
|
||||
timeout-sec = <20>;
|
||||
|
||||
interrupt-parent = <&rtlintc>;
|
||||
interrupt-names = "phase1", "phase2";
|
||||
interrupts = <19>, <18>;
|
||||
};
|
||||
|
||||
...
|
@ -10,9 +10,6 @@ maintainers:
|
||||
- Wolfram Sang <wsa+renesas@sang-engineering.com>
|
||||
- Geert Uytterhoeven <geert+renesas@glider.be>
|
||||
|
||||
allOf:
|
||||
- $ref: "watchdog.yaml#"
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
@ -22,6 +19,11 @@ properties:
|
||||
- renesas,r7s9210-wdt # RZ/A2
|
||||
- const: renesas,rza-wdt # RZ/A
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,r9a07g044-wdt # RZ/G2{L,LC}
|
||||
- const: renesas,rzg2l-wdt # RZ/G2L
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,r8a7742-wdt # RZ/G1H
|
||||
@ -56,11 +58,13 @@ properties:
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
interrupts: true
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
interrupt-names: true
|
||||
|
||||
clocks: true
|
||||
|
||||
clock-names: true
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
@ -75,17 +79,52 @@ required:
|
||||
- reg
|
||||
- clocks
|
||||
|
||||
if:
|
||||
not:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,rza-wdt
|
||||
then:
|
||||
required:
|
||||
- power-domains
|
||||
- resets
|
||||
allOf:
|
||||
- $ref: "watchdog.yaml#"
|
||||
|
||||
- if:
|
||||
not:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,rza-wdt
|
||||
then:
|
||||
required:
|
||||
- power-domains
|
||||
- resets
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,rzg2l-wdt
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 2
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: wdt
|
||||
- const: perrout
|
||||
clocks:
|
||||
items:
|
||||
- description: Register access clock
|
||||
- description: Main clock
|
||||
clock-names:
|
||||
items:
|
||||
- const: pclk
|
||||
- const: oscclk
|
||||
required:
|
||||
- clock-names
|
||||
- interrupt-names
|
||||
else:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
@ -22,25 +22,32 @@ properties:
|
||||
- samsung,exynos5250-wdt # for Exynos5250
|
||||
- samsung,exynos5420-wdt # for Exynos5420
|
||||
- samsung,exynos7-wdt # for Exynos7
|
||||
- samsung,exynos850-wdt # for Exynos850
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: watchdog
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
samsung,cluster-index:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
Index of CPU cluster on which watchdog is running (in case of Exynos850)
|
||||
|
||||
samsung,syscon-phandle:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
description:
|
||||
Phandle to the PMU system controller node (in case of Exynos5250
|
||||
and Exynos5420).
|
||||
Phandle to the PMU system controller node (in case of Exynos5250,
|
||||
Exynos5420, Exynos7 and Exynos850).
|
||||
|
||||
required:
|
||||
- compatible
|
||||
@ -58,9 +65,40 @@ allOf:
|
||||
enum:
|
||||
- samsung,exynos5250-wdt
|
||||
- samsung,exynos5420-wdt
|
||||
- samsung,exynos7-wdt
|
||||
- samsung,exynos850-wdt
|
||||
then:
|
||||
required:
|
||||
- samsung,syscon-phandle
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- samsung,exynos850-wdt
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: Bus clock, used for register interface
|
||||
- description: Source clock (driving watchdog counter)
|
||||
clock-names:
|
||||
items:
|
||||
- const: watchdog
|
||||
- const: watchdog_src
|
||||
samsung,cluster-index:
|
||||
enum: [0, 1]
|
||||
required:
|
||||
- samsung,cluster-index
|
||||
else:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: Bus clock, which is also a source clock
|
||||
clock-names:
|
||||
items:
|
||||
- const: watchdog
|
||||
samsung,cluster-index: false
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
|
@ -6,6 +6,16 @@ Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
|
||||
This small document introduces how to test DMA drivers using dmatest module.
|
||||
|
||||
The dmatest module tests DMA memcpy, memset, XOR and RAID6 P+Q operations using
|
||||
various lengths and various offsets into the source and destination buffers. It
|
||||
will initialize both buffers with a repeatable pattern and verify that the DMA
|
||||
engine copies the requested region and nothing more. It will also verify that
|
||||
the bytes aren't swapped around, and that the source buffer isn't modified.
|
||||
|
||||
The dmatest module can be configured to test a specific channel. It can also
|
||||
test multiple channels at the same time, and it can start multiple threads
|
||||
competing for the same channel.
|
||||
|
||||
.. note::
|
||||
The test suite works only on the channels that have at least one
|
||||
capability of the following: DMA_MEMCPY (memory-to-memory), DMA_MEMSET
|
||||
@ -143,13 +153,14 @@ Part 5 - Handling channel allocation
|
||||
Allocating Channels
|
||||
-------------------
|
||||
|
||||
Channels are required to be configured prior to starting the test run.
|
||||
Attempting to run the test without configuring the channels will fail.
|
||||
Channels do not need to be configured prior to starting a test run. Attempting
|
||||
to run the test without configuring the channels will result in testing any
|
||||
channels that are available.
|
||||
|
||||
Example::
|
||||
|
||||
% echo 1 > /sys/module/dmatest/parameters/run
|
||||
dmatest: Could not start test, no channels configured
|
||||
dmatest: No channels configured, continue with any
|
||||
|
||||
Channels are registered using the "channel" parameter. Channels can be requested by their
|
||||
name, once requested, the channel is registered and a pending thread is added to the test list.
|
||||
|
@ -162,6 +162,29 @@ Currently, the types available are:
|
||||
|
||||
- The device is able to do memory to memory copies
|
||||
|
||||
- - DMA_MEMCPY_SG
|
||||
|
||||
- The device supports memory to memory scatter-gather transfers.
|
||||
|
||||
- Even though a plain memcpy can look like a particular case of a
|
||||
scatter-gather transfer, with a single chunk to copy, it's a distinct
|
||||
transaction type in the mem2mem transfer case. This is because some very
|
||||
simple devices might be able to do contiguous single-chunk memory copies,
|
||||
but have no support for more complex SG transfers.
|
||||
|
||||
- No matter what the overall size of the combined chunks for source and
|
||||
destination is, only as many bytes as the smallest of the two will be
|
||||
transmitted. That means the number and size of the scatter-gather buffers in
|
||||
both lists need not be the same, and that the operation functionally is
|
||||
equivalent to a ``strncpy`` where the ``count`` argument equals the smallest
|
||||
total size of the two scatter-gather list buffers.
|
||||
|
||||
- It's usually used for copying pixel data between host memory and
|
||||
memory-mapped GPU device memory, such as found on modern PCI video graphics
|
||||
cards. The most immediate example is the OpenGL API function
|
||||
``glReadPielx()``, which might require a verbatim copy of a huge framebuffer
|
||||
from local device memory onto host memory.
|
||||
|
||||
- DMA_XOR
|
||||
|
||||
- The device is able to perform XOR operations on memory areas
|
||||
|
@ -367,6 +367,7 @@ Code Seq# Include File Comments
|
||||
<mailto:aherrman@de.ibm.com>
|
||||
0xE5 00-3F linux/fuse.h
|
||||
0xEC 00-01 drivers/platform/chrome/cros_ec_dev.h ChromeOS EC driver
|
||||
0xEE 00-09 uapi/linux/pfrut.h Platform Firmware Runtime Update and Telemetry
|
||||
0xF3 00-3F drivers/usb/misc/sisusbvga/sisusb.h sisfb (in development)
|
||||
<mailto:thomas@winischhofer.net>
|
||||
0xF6 all LTTng Linux Trace Toolkit Next Generation
|
||||
|
18
MAINTAINERS
18
MAINTAINERS
@ -4745,7 +4745,6 @@ F: drivers/media/pci/cobalt/
|
||||
|
||||
COCCINELLE/Semantic Patches (SmPL)
|
||||
M: Julia Lawall <Julia.Lawall@inria.fr>
|
||||
M: Gilles Muller <Gilles.Muller@inria.fr>
|
||||
M: Nicolas Palix <nicolas.palix@imag.fr>
|
||||
L: cocci@inria.fr (moderated for non-subscribers)
|
||||
S: Supported
|
||||
@ -7583,11 +7582,12 @@ W: http://floatingpoint.sourceforge.net/emulator/index.html
|
||||
F: arch/x86/math-emu/
|
||||
|
||||
FRAMEBUFFER LAYER
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
M: Helge Deller <deller@gmx.de>
|
||||
L: linux-fbdev@vger.kernel.org
|
||||
S: Orphan
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Maintained
|
||||
Q: http://patchwork.kernel.org/project/linux-fbdev/list/
|
||||
T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev.git
|
||||
F: Documentation/fb/
|
||||
F: drivers/video/
|
||||
F: include/linux/fb.h
|
||||
@ -16351,6 +16351,13 @@ S: Maintained
|
||||
F: include/sound/rt*.h
|
||||
F: sound/soc/codecs/rt*
|
||||
|
||||
REALTEK OTTO WATCHDOG
|
||||
M: Sander Vanheule <sander@svanheule.net>
|
||||
L: linux-watchdog@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/watchdog/realtek,otto-wdt.yaml
|
||||
F: drivers/watchdog/realtek_otto_wdt.c
|
||||
|
||||
REALTEK RTL83xx SMI DSA ROUTER CHIPS
|
||||
M: Linus Walleij <linus.walleij@linaro.org>
|
||||
S: Maintained
|
||||
@ -16400,7 +16407,6 @@ S: Supported
|
||||
F: fs/reiserfs/
|
||||
|
||||
REMOTE PROCESSOR (REMOTEPROC) SUBSYSTEM
|
||||
M: Ohad Ben-Cohen <ohad@wizery.com>
|
||||
M: Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||
M: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
L: linux-remoteproc@vger.kernel.org
|
||||
@ -16414,7 +16420,6 @@ F: include/linux/remoteproc.h
|
||||
F: include/linux/remoteproc/
|
||||
|
||||
REMOTE PROCESSOR MESSAGING (RPMSG) SUBSYSTEM
|
||||
M: Ohad Ben-Cohen <ohad@wizery.com>
|
||||
M: Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||
M: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
L: linux-remoteproc@vger.kernel.org
|
||||
@ -20379,6 +20384,7 @@ M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
L: virtualization@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
F: Documentation/ABI/testing/sysfs-bus-vdpa
|
||||
F: Documentation/devicetree/bindings/virtio/
|
||||
F: drivers/block/virtio_blk.c
|
||||
F: drivers/crypto/virtio/
|
||||
|
@ -50,8 +50,12 @@
|
||||
* are redone after IRQs are re-enabled (and gcc doesn't reuse stale register)
|
||||
*
|
||||
* Noted at the time of Abilis Timer List corruption
|
||||
* Orig Bug + Rejected solution : https://lkml.org/lkml/2013/3/29/67
|
||||
* Reasoning : https://lkml.org/lkml/2013/4/8/15
|
||||
*
|
||||
* Orig Bug + Rejected solution:
|
||||
* https://lore.kernel.org/lkml/1364553218-31255-1-git-send-email-vgupta@synopsys.com
|
||||
*
|
||||
* Reasoning:
|
||||
* https://lore.kernel.org/lkml/CA+55aFyFWjpSVQM6M266tKrG_ZXJzZ-nYejpmXYQXbrr42mGPQ@mail.gmail.com
|
||||
*
|
||||
******************************************************************/
|
||||
|
||||
|
@ -63,166 +63,4 @@ struct arc_reg_cc_build {
|
||||
|
||||
#define PERF_COUNT_ARC_HW_MAX (PERF_COUNT_HW_MAX + 8)
|
||||
|
||||
/*
|
||||
* Some ARC pct quirks:
|
||||
*
|
||||
* PERF_COUNT_HW_STALLED_CYCLES_BACKEND
|
||||
* PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
|
||||
* The ARC 700 can either measure stalls per pipeline stage, or all stalls
|
||||
* combined; for now we assign all stalls to STALLED_CYCLES_BACKEND
|
||||
* and all pipeline flushes (e.g. caused by mispredicts, etc.) to
|
||||
* STALLED_CYCLES_FRONTEND.
|
||||
*
|
||||
* We could start multiple performance counters and combine everything
|
||||
* afterwards, but that makes it complicated.
|
||||
*
|
||||
* Note that I$ cache misses aren't counted by either of the two!
|
||||
*/
|
||||
|
||||
/*
|
||||
* ARC PCT has hardware conditions with fixed "names" but variable "indexes"
|
||||
* (based on a specific RTL build)
|
||||
* Below is the static map between perf generic/arc specific event_id and
|
||||
* h/w condition names.
|
||||
* At the time of probe, we loop thru each index and find it's name to
|
||||
* complete the mapping of perf event_id to h/w index as latter is needed
|
||||
* to program the counter really
|
||||
*/
|
||||
static const char * const arc_pmu_ev_hw_map[] = {
|
||||
/* count cycles */
|
||||
[PERF_COUNT_HW_CPU_CYCLES] = "crun",
|
||||
[PERF_COUNT_HW_REF_CPU_CYCLES] = "crun",
|
||||
[PERF_COUNT_HW_BUS_CYCLES] = "crun",
|
||||
|
||||
[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = "bflush",
|
||||
[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = "bstall",
|
||||
|
||||
/* counts condition */
|
||||
[PERF_COUNT_HW_INSTRUCTIONS] = "iall",
|
||||
/* All jump instructions that are taken */
|
||||
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = "ijmptak",
|
||||
#ifdef CONFIG_ISA_ARCV2
|
||||
[PERF_COUNT_HW_BRANCH_MISSES] = "bpmp",
|
||||
#else
|
||||
[PERF_COUNT_ARC_BPOK] = "bpok", /* NP-NT, PT-T, PNT-NT */
|
||||
[PERF_COUNT_HW_BRANCH_MISSES] = "bpfail", /* NP-T, PT-NT, PNT-T */
|
||||
#endif
|
||||
[PERF_COUNT_ARC_LDC] = "imemrdc", /* Instr: mem read cached */
|
||||
[PERF_COUNT_ARC_STC] = "imemwrc", /* Instr: mem write cached */
|
||||
|
||||
[PERF_COUNT_ARC_DCLM] = "dclm", /* D-cache Load Miss */
|
||||
[PERF_COUNT_ARC_DCSM] = "dcsm", /* D-cache Store Miss */
|
||||
[PERF_COUNT_ARC_ICM] = "icm", /* I-cache Miss */
|
||||
[PERF_COUNT_ARC_EDTLB] = "edtlb", /* D-TLB Miss */
|
||||
[PERF_COUNT_ARC_EITLB] = "eitlb", /* I-TLB Miss */
|
||||
|
||||
[PERF_COUNT_HW_CACHE_REFERENCES] = "imemrdc", /* Instr: mem read cached */
|
||||
[PERF_COUNT_HW_CACHE_MISSES] = "dclm", /* D-cache Load Miss */
|
||||
};
|
||||
|
||||
#define C(_x) PERF_COUNT_HW_CACHE_##_x
|
||||
#define CACHE_OP_UNSUPPORTED 0xffff
|
||||
|
||||
static const unsigned int arc_pmu_cache_map[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {
|
||||
[C(L1D)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_ARC_LDC,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_DCLM,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_ARC_STC,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_DCSM,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(L1I)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_HW_INSTRUCTIONS,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_ICM,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(LL)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(DTLB)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_ARC_LDC,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_EDTLB,
|
||||
},
|
||||
/* DTLB LD/ST Miss not segregated by h/w*/
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(ITLB)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_EITLB,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(BPU)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_HW_BRANCH_INSTRUCTIONS,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_HW_BRANCH_MISSES,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(NODE)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
#endif /* __ASM_PERF_EVENT_H */
|
||||
|
@ -99,8 +99,8 @@ static inline __attribute_const__ struct thread_info *current_thread_info(void)
|
||||
|
||||
/*
|
||||
* _TIF_ALLWORK_MASK includes SYSCALL_TRACE, but we don't need it.
|
||||
* SYSCALL_TRACE is anyway seperately/unconditionally tested right after a
|
||||
* syscall, so all that reamins to be tested is _TIF_WORK_MASK
|
||||
* SYSCALL_TRACE is anyway separately/unconditionally tested right after a
|
||||
* syscall, so all that remains to be tested is _TIF_WORK_MASK
|
||||
*/
|
||||
|
||||
#endif /* _ASM_THREAD_INFO_H */
|
||||
|
@ -17,6 +17,168 @@
|
||||
/* HW holds 8 symbols + one for null terminator */
|
||||
#define ARCPMU_EVENT_NAME_LEN 9
|
||||
|
||||
/*
|
||||
* Some ARC pct quirks:
|
||||
*
|
||||
* PERF_COUNT_HW_STALLED_CYCLES_BACKEND
|
||||
* PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
|
||||
* The ARC 700 can either measure stalls per pipeline stage, or all stalls
|
||||
* combined; for now we assign all stalls to STALLED_CYCLES_BACKEND
|
||||
* and all pipeline flushes (e.g. caused by mispredicts, etc.) to
|
||||
* STALLED_CYCLES_FRONTEND.
|
||||
*
|
||||
* We could start multiple performance counters and combine everything
|
||||
* afterwards, but that makes it complicated.
|
||||
*
|
||||
* Note that I$ cache misses aren't counted by either of the two!
|
||||
*/
|
||||
|
||||
/*
|
||||
* ARC PCT has hardware conditions with fixed "names" but variable "indexes"
|
||||
* (based on a specific RTL build)
|
||||
* Below is the static map between perf generic/arc specific event_id and
|
||||
* h/w condition names.
|
||||
* At the time of probe, we loop thru each index and find it's name to
|
||||
* complete the mapping of perf event_id to h/w index as latter is needed
|
||||
* to program the counter really
|
||||
*/
|
||||
static const char * const arc_pmu_ev_hw_map[] = {
|
||||
/* count cycles */
|
||||
[PERF_COUNT_HW_CPU_CYCLES] = "crun",
|
||||
[PERF_COUNT_HW_REF_CPU_CYCLES] = "crun",
|
||||
[PERF_COUNT_HW_BUS_CYCLES] = "crun",
|
||||
|
||||
[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = "bflush",
|
||||
[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = "bstall",
|
||||
|
||||
/* counts condition */
|
||||
[PERF_COUNT_HW_INSTRUCTIONS] = "iall",
|
||||
/* All jump instructions that are taken */
|
||||
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = "ijmptak",
|
||||
#ifdef CONFIG_ISA_ARCV2
|
||||
[PERF_COUNT_HW_BRANCH_MISSES] = "bpmp",
|
||||
#else
|
||||
[PERF_COUNT_ARC_BPOK] = "bpok", /* NP-NT, PT-T, PNT-NT */
|
||||
[PERF_COUNT_HW_BRANCH_MISSES] = "bpfail", /* NP-T, PT-NT, PNT-T */
|
||||
#endif
|
||||
[PERF_COUNT_ARC_LDC] = "imemrdc", /* Instr: mem read cached */
|
||||
[PERF_COUNT_ARC_STC] = "imemwrc", /* Instr: mem write cached */
|
||||
|
||||
[PERF_COUNT_ARC_DCLM] = "dclm", /* D-cache Load Miss */
|
||||
[PERF_COUNT_ARC_DCSM] = "dcsm", /* D-cache Store Miss */
|
||||
[PERF_COUNT_ARC_ICM] = "icm", /* I-cache Miss */
|
||||
[PERF_COUNT_ARC_EDTLB] = "edtlb", /* D-TLB Miss */
|
||||
[PERF_COUNT_ARC_EITLB] = "eitlb", /* I-TLB Miss */
|
||||
|
||||
[PERF_COUNT_HW_CACHE_REFERENCES] = "imemrdc", /* Instr: mem read cached */
|
||||
[PERF_COUNT_HW_CACHE_MISSES] = "dclm", /* D-cache Load Miss */
|
||||
};
|
||||
|
||||
#define C(_x) PERF_COUNT_HW_CACHE_##_x
|
||||
#define CACHE_OP_UNSUPPORTED 0xffff
|
||||
|
||||
static const unsigned int arc_pmu_cache_map[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {
|
||||
[C(L1D)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_ARC_LDC,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_DCLM,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_ARC_STC,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_DCSM,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(L1I)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_HW_INSTRUCTIONS,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_ICM,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(LL)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(DTLB)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_ARC_LDC,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_EDTLB,
|
||||
},
|
||||
/* DTLB LD/ST Miss not segregated by h/w*/
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(ITLB)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_ARC_EITLB,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(BPU)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = PERF_COUNT_HW_BRANCH_INSTRUCTIONS,
|
||||
[C(RESULT_MISS)] = PERF_COUNT_HW_BRANCH_MISSES,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
[C(NODE)] = {
|
||||
[C(OP_READ)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_WRITE)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
[C(OP_PREFETCH)] = {
|
||||
[C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED,
|
||||
[C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
enum arc_pmu_attr_groups {
|
||||
ARCPMU_ATTR_GR_EVENTS,
|
||||
ARCPMU_ATTR_GR_FORMATS,
|
||||
@ -328,7 +490,7 @@ static void arc_pmu_stop(struct perf_event *event, int flags)
|
||||
}
|
||||
|
||||
if (!(event->hw.state & PERF_HES_STOPPED)) {
|
||||
/* stop ARC pmu here */
|
||||
/* stop hw counter here */
|
||||
write_aux_reg(ARC_REG_PCT_INDEX, idx);
|
||||
|
||||
/* condition code #0 is always "never" */
|
||||
@ -361,7 +523,7 @@ static int arc_pmu_add(struct perf_event *event, int flags)
|
||||
{
|
||||
struct arc_pmu_cpu *pmu_cpu = this_cpu_ptr(&arc_pmu_cpu);
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
int idx = hwc->idx;
|
||||
int idx;
|
||||
|
||||
idx = ffz(pmu_cpu->used_mask[0]);
|
||||
if (idx == arc_pmu->n_counters)
|
||||
|
@ -245,14 +245,9 @@ static void swap_eh_frame_hdr_table_entries(void *p1, void *p2, int size)
|
||||
{
|
||||
struct eh_frame_hdr_table_entry *e1 = p1;
|
||||
struct eh_frame_hdr_table_entry *e2 = p2;
|
||||
unsigned long v;
|
||||
|
||||
v = e1->start;
|
||||
e1->start = e2->start;
|
||||
e2->start = v;
|
||||
v = e1->fde;
|
||||
e1->fde = e2->fde;
|
||||
e2->fde = v;
|
||||
swap(e1->start, e2->start);
|
||||
swap(e1->fde, e2->fde);
|
||||
}
|
||||
|
||||
static void init_unwind_hdr(struct unwind_table *table,
|
||||
|
@ -32,7 +32,7 @@ void arch_dma_prep_coherent(struct page *page, size_t size)
|
||||
|
||||
/*
|
||||
* Cache operations depending on function and direction argument, inspired by
|
||||
* https://lkml.org/lkml/2018/5/18/979
|
||||
* https://lore.kernel.org/lkml/20180518175004.GF17671@n2100.armlinux.org.uk
|
||||
* "dma_sync_*_for_cpu and direction=TO_DEVICE (was Re: [PATCH 02/20]
|
||||
* dma-mapping: provide a generic dma-noncoherent implementation)"
|
||||
*
|
||||
|
@ -50,7 +50,7 @@ static void __init axs10x_enable_gpio_intc_wire(void)
|
||||
* Current implementation of "irq-dw-apb-ictl" driver doesn't work well
|
||||
* with stacked INTCs. In particular problem happens if its master INTC
|
||||
* not yet instantiated. See discussion here -
|
||||
* https://lkml.org/lkml/2015/3/4/755
|
||||
* https://lore.kernel.org/lkml/54F6FE2C.7020309@synopsys.com
|
||||
*
|
||||
* So setup the first gpio block as a passive pass thru and hide it from
|
||||
* DT hardware topology - connect MB intc directly to cpu intc
|
||||
|
@ -52,7 +52,7 @@ static void __init hsdk_enable_gpio_intc_wire(void)
|
||||
* Current implementation of "irq-dw-apb-ictl" driver doesn't work well
|
||||
* with stacked INTCs. In particular problem happens if its master INTC
|
||||
* not yet instantiated. See discussion here -
|
||||
* https://lkml.org/lkml/2015/3/4/755
|
||||
* https://lore.kernel.org/lkml/54F6FE2C.7020309@synopsys.com
|
||||
*
|
||||
* So setup the first gpio block as a passive pass thru and hide it from
|
||||
* DT hardware topology - connect intc directly to cpu intc
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/platform_data/bcm7038_wdt.h>
|
||||
#include <bcm63xx_cpu.h>
|
||||
|
||||
static struct resource wdt_resources[] = {
|
||||
@ -19,11 +20,18 @@ static struct resource wdt_resources[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct bcm7038_wdt_platform_data bcm63xx_wdt_pdata = {
|
||||
.clk_name = "periph",
|
||||
};
|
||||
|
||||
static struct platform_device bcm63xx_wdt_device = {
|
||||
.name = "bcm63xx-wdt",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(wdt_resources),
|
||||
.resource = wdt_resources,
|
||||
.dev = {
|
||||
.platform_data = &bcm63xx_wdt_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
int __init bcm63xx_wdt_register(void)
|
||||
|
@ -616,7 +616,7 @@ static void um_pci_virtio_remove(struct virtio_device *vdev)
|
||||
int i;
|
||||
|
||||
/* Stop all virtqueues */
|
||||
vdev->config->reset(vdev);
|
||||
virtio_reset_device(vdev);
|
||||
vdev->config->del_vqs(vdev);
|
||||
|
||||
device_set_wakeup_enable(&vdev->dev, false);
|
||||
|
@ -1,4 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <asm/e820/api.h>
|
||||
|
||||
@ -23,11 +24,31 @@ static void resource_clip(struct resource *res, resource_size_t start,
|
||||
res->start = end + 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some BIOS-es contain a bug where they add addresses which map to
|
||||
* system RAM in the PCI host bridge window returned by the ACPI _CRS
|
||||
* method, see commit 4dc2287c1805 ("x86: avoid E820 regions when
|
||||
* allocating address space"). To avoid this Linux by default excludes
|
||||
* E820 reservations when allocating addresses since 2010.
|
||||
* In 2019 some systems have shown-up with E820 reservations which cover
|
||||
* the entire _CRS returned PCI host bridge window, causing all attempts
|
||||
* to assign memory to PCI BARs to fail if Linux uses E820 reservations.
|
||||
*
|
||||
* Ideally Linux would fully stop using E820 reservations, but then
|
||||
* the old systems this was added for will regress.
|
||||
* Instead keep the old behavior for old systems, while ignoring the
|
||||
* E820 reservations for any systems from now on.
|
||||
*/
|
||||
static void remove_e820_regions(struct resource *avail)
|
||||
{
|
||||
int i;
|
||||
int i, year = dmi_get_bios_year();
|
||||
struct e820_entry *entry;
|
||||
|
||||
if (year >= 2018)
|
||||
return;
|
||||
|
||||
pr_info_once("PCI: Removing E820 reservations from host bridge windows\n");
|
||||
|
||||
for (i = 0; i < e820_table->nr_entries; i++) {
|
||||
entry = &e820_table->entries[i];
|
||||
|
||||
|
@ -1928,5 +1928,3 @@ source "crypto/asymmetric_keys/Kconfig"
|
||||
source "certs/Kconfig"
|
||||
|
||||
endif # if CRYPTO
|
||||
|
||||
source "lib/crypto/Kconfig"
|
||||
|
@ -520,6 +520,28 @@ config ACPI_CONFIGFS
|
||||
userspace. The configurable ACPI groups will be visible under
|
||||
/config/acpi, assuming configfs is mounted under /config.
|
||||
|
||||
config ACPI_PFRUT
|
||||
tristate "ACPI Platform Firmware Runtime Update and Telemetry"
|
||||
depends on 64BIT
|
||||
help
|
||||
This mechanism allows certain pieces of the platform firmware
|
||||
to be updated on the fly while the system is running (runtime)
|
||||
without the need to restart it, which is key in the cases when
|
||||
the system needs to be available 100% of the time and it cannot
|
||||
afford the downtime related to restarting it, or when the work
|
||||
carried out by the system is particularly important, so it cannot
|
||||
be interrupted, and it is not practical to wait until it is complete.
|
||||
|
||||
The existing firmware code can be modified (driver update) or
|
||||
extended by adding new code to the firmware (code injection).
|
||||
|
||||
Besides, the telemetry driver allows user space to fetch telemetry
|
||||
data from the firmware with the help of the Platform Firmware Runtime
|
||||
Telemetry interface.
|
||||
|
||||
To compile the drivers as modules, choose M here:
|
||||
the modules will be called pfr_update and pfr_telemetry.
|
||||
|
||||
if ARM64
|
||||
source "drivers/acpi/arm64/Kconfig"
|
||||
|
||||
|
@ -103,6 +103,7 @@ obj-$(CONFIG_ACPI_CPPC_LIB) += cppc_acpi.o
|
||||
obj-$(CONFIG_ACPI_SPCR_TABLE) += spcr.o
|
||||
obj-$(CONFIG_ACPI_DEBUGGER_USER) += acpi_dbg.o
|
||||
obj-$(CONFIG_ACPI_PPTT) += pptt.o
|
||||
obj-$(CONFIG_ACPI_PFRUT) += pfr_update.o pfr_telemetry.o
|
||||
|
||||
# processor has its own "processor." module_param namespace
|
||||
processor-y := processor_driver.o
|
||||
|
@ -102,6 +102,8 @@ static int fch_misc_setup(struct apd_private_data *pdata)
|
||||
resource_size(rentry->res));
|
||||
break;
|
||||
}
|
||||
if (!clk_data->base)
|
||||
return -ENOMEM;
|
||||
|
||||
acpi_dev_free_resource_list(&resource_list);
|
||||
|
||||
|
@ -31,7 +31,7 @@ struct pcc_data {
|
||||
struct acpi_pcc_info ctx;
|
||||
};
|
||||
|
||||
struct acpi_pcc_info pcc_ctx;
|
||||
static struct acpi_pcc_info pcc_ctx;
|
||||
|
||||
static void pcc_rx_callback(struct mbox_client *cl, void *m)
|
||||
{
|
||||
|
@ -14,7 +14,7 @@
|
||||
int early_acpi_osi_init(void);
|
||||
int acpi_osi_init(void);
|
||||
acpi_status acpi_os_initialize1(void);
|
||||
int acpi_scan_init(void);
|
||||
void acpi_scan_init(void);
|
||||
#ifdef CONFIG_PCI
|
||||
void acpi_pci_root_init(void);
|
||||
void acpi_pci_link_init(void);
|
||||
|
435
drivers/acpi/pfr_telemetry.c
Normal file
435
drivers/acpi/pfr_telemetry.c
Normal file
@ -0,0 +1,435 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* ACPI Platform Firmware Runtime Telemetry driver
|
||||
*
|
||||
* Copyright (C) 2021 Intel Corporation
|
||||
* Author: Chen Yu <yu.c.chen@intel.com>
|
||||
*
|
||||
* This driver allows user space to fetch telemetry data from the
|
||||
* firmware with the help of the Platform Firmware Runtime Telemetry
|
||||
* interface.
|
||||
*/
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/uuid.h>
|
||||
|
||||
#include <uapi/linux/pfrut.h>
|
||||
|
||||
#define PFRT_LOG_EXEC_IDX 0
|
||||
#define PFRT_LOG_HISTORY_IDX 1
|
||||
|
||||
#define PFRT_LOG_ERR 0
|
||||
#define PFRT_LOG_WARN 1
|
||||
#define PFRT_LOG_INFO 2
|
||||
#define PFRT_LOG_VERB 4
|
||||
|
||||
#define PFRT_FUNC_SET_LEV 1
|
||||
#define PFRT_FUNC_GET_LEV 2
|
||||
#define PFRT_FUNC_GET_DATA 3
|
||||
|
||||
#define PFRT_REVID_1 1
|
||||
#define PFRT_REVID_2 2
|
||||
#define PFRT_DEFAULT_REV_ID PFRT_REVID_1
|
||||
|
||||
enum log_index {
|
||||
LOG_STATUS_IDX = 0,
|
||||
LOG_EXT_STATUS_IDX = 1,
|
||||
LOG_MAX_SZ_IDX = 2,
|
||||
LOG_CHUNK1_LO_IDX = 3,
|
||||
LOG_CHUNK1_HI_IDX = 4,
|
||||
LOG_CHUNK1_SZ_IDX = 5,
|
||||
LOG_CHUNK2_LO_IDX = 6,
|
||||
LOG_CHUNK2_HI_IDX = 7,
|
||||
LOG_CHUNK2_SZ_IDX = 8,
|
||||
LOG_ROLLOVER_CNT_IDX = 9,
|
||||
LOG_RESET_CNT_IDX = 10,
|
||||
LOG_NR_IDX
|
||||
};
|
||||
|
||||
struct pfrt_log_device {
|
||||
int index;
|
||||
struct pfrt_log_info info;
|
||||
struct device *parent_dev;
|
||||
struct miscdevice miscdev;
|
||||
};
|
||||
|
||||
/* pfrt_guid is the parameter for _DSM method */
|
||||
static const guid_t pfrt_log_guid =
|
||||
GUID_INIT(0x75191659, 0x8178, 0x4D9D, 0xB8, 0x8F, 0xAC, 0x5E,
|
||||
0x5E, 0x93, 0xE8, 0xBF);
|
||||
|
||||
static DEFINE_IDA(pfrt_log_ida);
|
||||
|
||||
static inline struct pfrt_log_device *to_pfrt_log_dev(struct file *file)
|
||||
{
|
||||
return container_of(file->private_data, struct pfrt_log_device, miscdev);
|
||||
}
|
||||
|
||||
static int get_pfrt_log_data_info(struct pfrt_log_data_info *data_info,
|
||||
struct pfrt_log_device *pfrt_log_dev)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(pfrt_log_dev->parent_dev);
|
||||
union acpi_object *out_obj, in_obj, in_buf;
|
||||
int ret = -EBUSY;
|
||||
|
||||
memset(data_info, 0, sizeof(*data_info));
|
||||
memset(&in_obj, 0, sizeof(in_obj));
|
||||
memset(&in_buf, 0, sizeof(in_buf));
|
||||
in_obj.type = ACPI_TYPE_PACKAGE;
|
||||
in_obj.package.count = 1;
|
||||
in_obj.package.elements = &in_buf;
|
||||
in_buf.type = ACPI_TYPE_INTEGER;
|
||||
in_buf.integer.value = pfrt_log_dev->info.log_type;
|
||||
|
||||
out_obj = acpi_evaluate_dsm_typed(handle, &pfrt_log_guid,
|
||||
pfrt_log_dev->info.log_revid, PFRT_FUNC_GET_DATA,
|
||||
&in_obj, ACPI_TYPE_PACKAGE);
|
||||
if (!out_obj)
|
||||
return -EINVAL;
|
||||
|
||||
if (out_obj->package.count < LOG_NR_IDX ||
|
||||
out_obj->package.elements[LOG_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_EXT_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_MAX_SZ_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_CHUNK1_LO_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_CHUNK1_HI_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_CHUNK1_SZ_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_CHUNK2_LO_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_CHUNK2_HI_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_CHUNK2_SZ_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_ROLLOVER_CNT_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[LOG_RESET_CNT_IDX].type != ACPI_TYPE_INTEGER)
|
||||
goto free_acpi_buffer;
|
||||
|
||||
data_info->status = out_obj->package.elements[LOG_STATUS_IDX].integer.value;
|
||||
data_info->ext_status =
|
||||
out_obj->package.elements[LOG_EXT_STATUS_IDX].integer.value;
|
||||
if (data_info->status != DSM_SUCCEED) {
|
||||
dev_dbg(pfrt_log_dev->parent_dev, "Error Status:%d\n", data_info->status);
|
||||
dev_dbg(pfrt_log_dev->parent_dev, "Error Extend Status:%d\n",
|
||||
data_info->ext_status);
|
||||
goto free_acpi_buffer;
|
||||
}
|
||||
|
||||
data_info->max_data_size =
|
||||
out_obj->package.elements[LOG_MAX_SZ_IDX].integer.value;
|
||||
data_info->chunk1_addr_lo =
|
||||
out_obj->package.elements[LOG_CHUNK1_LO_IDX].integer.value;
|
||||
data_info->chunk1_addr_hi =
|
||||
out_obj->package.elements[LOG_CHUNK1_HI_IDX].integer.value;
|
||||
data_info->chunk1_size =
|
||||
out_obj->package.elements[LOG_CHUNK1_SZ_IDX].integer.value;
|
||||
data_info->chunk2_addr_lo =
|
||||
out_obj->package.elements[LOG_CHUNK2_LO_IDX].integer.value;
|
||||
data_info->chunk2_addr_hi =
|
||||
out_obj->package.elements[LOG_CHUNK2_HI_IDX].integer.value;
|
||||
data_info->chunk2_size =
|
||||
out_obj->package.elements[LOG_CHUNK2_SZ_IDX].integer.value;
|
||||
data_info->rollover_cnt =
|
||||
out_obj->package.elements[LOG_ROLLOVER_CNT_IDX].integer.value;
|
||||
data_info->reset_cnt =
|
||||
out_obj->package.elements[LOG_RESET_CNT_IDX].integer.value;
|
||||
|
||||
ret = 0;
|
||||
|
||||
free_acpi_buffer:
|
||||
kfree(out_obj);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int set_pfrt_log_level(int level, struct pfrt_log_device *pfrt_log_dev)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(pfrt_log_dev->parent_dev);
|
||||
union acpi_object *out_obj, *obj, in_obj, in_buf;
|
||||
enum pfru_dsm_status status, ext_status;
|
||||
int ret = 0;
|
||||
|
||||
memset(&in_obj, 0, sizeof(in_obj));
|
||||
memset(&in_buf, 0, sizeof(in_buf));
|
||||
in_obj.type = ACPI_TYPE_PACKAGE;
|
||||
in_obj.package.count = 1;
|
||||
in_obj.package.elements = &in_buf;
|
||||
in_buf.type = ACPI_TYPE_INTEGER;
|
||||
in_buf.integer.value = level;
|
||||
|
||||
out_obj = acpi_evaluate_dsm_typed(handle, &pfrt_log_guid,
|
||||
pfrt_log_dev->info.log_revid, PFRT_FUNC_SET_LEV,
|
||||
&in_obj, ACPI_TYPE_PACKAGE);
|
||||
if (!out_obj)
|
||||
return -EINVAL;
|
||||
|
||||
obj = &out_obj->package.elements[0];
|
||||
status = obj->integer.value;
|
||||
if (status != DSM_SUCCEED) {
|
||||
obj = &out_obj->package.elements[1];
|
||||
ext_status = obj->integer.value;
|
||||
dev_dbg(pfrt_log_dev->parent_dev, "Error Status:%d\n", status);
|
||||
dev_dbg(pfrt_log_dev->parent_dev, "Error Extend Status:%d\n", ext_status);
|
||||
ret = -EBUSY;
|
||||
}
|
||||
|
||||
kfree(out_obj);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_pfrt_log_level(struct pfrt_log_device *pfrt_log_dev)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(pfrt_log_dev->parent_dev);
|
||||
union acpi_object *out_obj, *obj;
|
||||
enum pfru_dsm_status status, ext_status;
|
||||
int ret = -EBUSY;
|
||||
|
||||
out_obj = acpi_evaluate_dsm_typed(handle, &pfrt_log_guid,
|
||||
pfrt_log_dev->info.log_revid, PFRT_FUNC_GET_LEV,
|
||||
NULL, ACPI_TYPE_PACKAGE);
|
||||
if (!out_obj)
|
||||
return -EINVAL;
|
||||
|
||||
obj = &out_obj->package.elements[0];
|
||||
if (obj->type != ACPI_TYPE_INTEGER)
|
||||
goto free_acpi_buffer;
|
||||
|
||||
status = obj->integer.value;
|
||||
if (status != DSM_SUCCEED) {
|
||||
obj = &out_obj->package.elements[1];
|
||||
ext_status = obj->integer.value;
|
||||
dev_dbg(pfrt_log_dev->parent_dev, "Error Status:%d\n", status);
|
||||
dev_dbg(pfrt_log_dev->parent_dev, "Error Extend Status:%d\n", ext_status);
|
||||
goto free_acpi_buffer;
|
||||
}
|
||||
|
||||
obj = &out_obj->package.elements[2];
|
||||
if (obj->type != ACPI_TYPE_INTEGER)
|
||||
goto free_acpi_buffer;
|
||||
|
||||
ret = obj->integer.value;
|
||||
|
||||
free_acpi_buffer:
|
||||
kfree(out_obj);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int valid_log_level(u32 level)
|
||||
{
|
||||
return level == PFRT_LOG_ERR || level == PFRT_LOG_WARN ||
|
||||
level == PFRT_LOG_INFO || level == PFRT_LOG_VERB;
|
||||
}
|
||||
|
||||
static int valid_log_type(u32 type)
|
||||
{
|
||||
return type == PFRT_LOG_EXEC_IDX || type == PFRT_LOG_HISTORY_IDX;
|
||||
}
|
||||
|
||||
static inline int valid_log_revid(u32 id)
|
||||
{
|
||||
return id == PFRT_REVID_1 || id == PFRT_REVID_2;
|
||||
}
|
||||
|
||||
static long pfrt_log_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct pfrt_log_device *pfrt_log_dev = to_pfrt_log_dev(file);
|
||||
struct pfrt_log_data_info data_info;
|
||||
struct pfrt_log_info info;
|
||||
void __user *p;
|
||||
int ret = 0;
|
||||
|
||||
p = (void __user *)arg;
|
||||
|
||||
switch (cmd) {
|
||||
case PFRT_LOG_IOC_SET_INFO:
|
||||
if (copy_from_user(&info, p, sizeof(info)))
|
||||
return -EFAULT;
|
||||
|
||||
if (valid_log_revid(info.log_revid))
|
||||
pfrt_log_dev->info.log_revid = info.log_revid;
|
||||
|
||||
if (valid_log_level(info.log_level)) {
|
||||
ret = set_pfrt_log_level(info.log_level, pfrt_log_dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
pfrt_log_dev->info.log_level = info.log_level;
|
||||
}
|
||||
|
||||
if (valid_log_type(info.log_type))
|
||||
pfrt_log_dev->info.log_type = info.log_type;
|
||||
|
||||
return 0;
|
||||
|
||||
case PFRT_LOG_IOC_GET_INFO:
|
||||
info.log_level = get_pfrt_log_level(pfrt_log_dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
info.log_type = pfrt_log_dev->info.log_type;
|
||||
info.log_revid = pfrt_log_dev->info.log_revid;
|
||||
if (copy_to_user(p, &info, sizeof(info)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
|
||||
case PFRT_LOG_IOC_GET_DATA_INFO:
|
||||
ret = get_pfrt_log_data_info(&data_info, pfrt_log_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (copy_to_user(p, &data_info, sizeof(struct pfrt_log_data_info)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return -ENOTTY;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
pfrt_log_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
struct pfrt_log_device *pfrt_log_dev;
|
||||
struct pfrt_log_data_info info;
|
||||
unsigned long psize, vsize;
|
||||
phys_addr_t base_addr;
|
||||
int ret;
|
||||
|
||||
if (vma->vm_flags & VM_WRITE)
|
||||
return -EROFS;
|
||||
|
||||
/* changing from read to write with mprotect is not allowed */
|
||||
vma->vm_flags &= ~VM_MAYWRITE;
|
||||
|
||||
pfrt_log_dev = to_pfrt_log_dev(file);
|
||||
|
||||
ret = get_pfrt_log_data_info(&info, pfrt_log_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
base_addr = (phys_addr_t)((info.chunk2_addr_hi << 32) | info.chunk2_addr_lo);
|
||||
/* pfrt update has not been launched yet */
|
||||
if (!base_addr)
|
||||
return -ENODEV;
|
||||
|
||||
psize = info.max_data_size;
|
||||
/* base address and total buffer size must be page aligned */
|
||||
if (!PAGE_ALIGNED(base_addr) || !PAGE_ALIGNED(psize))
|
||||
return -ENODEV;
|
||||
|
||||
vsize = vma->vm_end - vma->vm_start;
|
||||
if (vsize > psize)
|
||||
return -EINVAL;
|
||||
|
||||
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||
if (io_remap_pfn_range(vma, vma->vm_start, PFN_DOWN(base_addr),
|
||||
vsize, vma->vm_page_prot))
|
||||
return -EAGAIN;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct file_operations acpi_pfrt_log_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.mmap = pfrt_log_mmap,
|
||||
.unlocked_ioctl = pfrt_log_ioctl,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
static int acpi_pfrt_log_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pfrt_log_device *pfrt_log_dev = platform_get_drvdata(pdev);
|
||||
|
||||
misc_deregister(&pfrt_log_dev->miscdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pfrt_log_put_idx(void *data)
|
||||
{
|
||||
struct pfrt_log_device *pfrt_log_dev = data;
|
||||
|
||||
ida_free(&pfrt_log_ida, pfrt_log_dev->index);
|
||||
}
|
||||
|
||||
static int acpi_pfrt_log_probe(struct platform_device *pdev)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(&pdev->dev);
|
||||
struct pfrt_log_device *pfrt_log_dev;
|
||||
int ret;
|
||||
|
||||
if (!acpi_has_method(handle, "_DSM")) {
|
||||
dev_dbg(&pdev->dev, "Missing _DSM\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pfrt_log_dev = devm_kzalloc(&pdev->dev, sizeof(*pfrt_log_dev), GFP_KERNEL);
|
||||
if (!pfrt_log_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = ida_alloc(&pfrt_log_ida, GFP_KERNEL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
pfrt_log_dev->index = ret;
|
||||
ret = devm_add_action_or_reset(&pdev->dev, pfrt_log_put_idx, pfrt_log_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pfrt_log_dev->info.log_revid = PFRT_DEFAULT_REV_ID;
|
||||
pfrt_log_dev->parent_dev = &pdev->dev;
|
||||
|
||||
pfrt_log_dev->miscdev.minor = MISC_DYNAMIC_MINOR;
|
||||
pfrt_log_dev->miscdev.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||
"pfrt%d",
|
||||
pfrt_log_dev->index);
|
||||
if (!pfrt_log_dev->miscdev.name)
|
||||
return -ENOMEM;
|
||||
|
||||
pfrt_log_dev->miscdev.nodename = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||
"acpi_pfr_telemetry%d",
|
||||
pfrt_log_dev->index);
|
||||
if (!pfrt_log_dev->miscdev.nodename)
|
||||
return -ENOMEM;
|
||||
|
||||
pfrt_log_dev->miscdev.fops = &acpi_pfrt_log_fops;
|
||||
pfrt_log_dev->miscdev.parent = &pdev->dev;
|
||||
|
||||
ret = misc_register(&pfrt_log_dev->miscdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
platform_set_drvdata(pdev, pfrt_log_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id acpi_pfrt_log_ids[] = {
|
||||
{"INTC1081"},
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, acpi_pfrt_log_ids);
|
||||
|
||||
static struct platform_driver acpi_pfrt_log_driver = {
|
||||
.driver = {
|
||||
.name = "pfr_telemetry",
|
||||
.acpi_match_table = acpi_pfrt_log_ids,
|
||||
},
|
||||
.probe = acpi_pfrt_log_probe,
|
||||
.remove = acpi_pfrt_log_remove,
|
||||
};
|
||||
module_platform_driver(acpi_pfrt_log_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Platform Firmware Runtime Update Telemetry driver");
|
||||
MODULE_LICENSE("GPL v2");
|
575
drivers/acpi/pfr_update.c
Normal file
575
drivers/acpi/pfr_update.c
Normal file
@ -0,0 +1,575 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* ACPI Platform Firmware Runtime Update Device driver
|
||||
*
|
||||
* Copyright (C) 2021 Intel Corporation
|
||||
* Author: Chen Yu <yu.c.chen@intel.com>
|
||||
*
|
||||
* pfr_update driver is used for Platform Firmware Runtime
|
||||
* Update, which includes the code injection and driver update.
|
||||
*/
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/uuid.h>
|
||||
|
||||
#include <uapi/linux/pfrut.h>
|
||||
|
||||
#define PFRU_FUNC_STANDARD_QUERY 0
|
||||
#define PFRU_FUNC_QUERY_UPDATE_CAP 1
|
||||
#define PFRU_FUNC_QUERY_BUF 2
|
||||
#define PFRU_FUNC_START 3
|
||||
|
||||
#define PFRU_CODE_INJECT_TYPE 1
|
||||
#define PFRU_DRIVER_UPDATE_TYPE 2
|
||||
|
||||
#define PFRU_REVID_1 1
|
||||
#define PFRU_REVID_2 2
|
||||
#define PFRU_DEFAULT_REV_ID PFRU_REVID_1
|
||||
|
||||
enum cap_index {
|
||||
CAP_STATUS_IDX = 0,
|
||||
CAP_UPDATE_IDX = 1,
|
||||
CAP_CODE_TYPE_IDX = 2,
|
||||
CAP_FW_VER_IDX = 3,
|
||||
CAP_CODE_RT_VER_IDX = 4,
|
||||
CAP_DRV_TYPE_IDX = 5,
|
||||
CAP_DRV_RT_VER_IDX = 6,
|
||||
CAP_DRV_SVN_IDX = 7,
|
||||
CAP_PLAT_ID_IDX = 8,
|
||||
CAP_OEM_ID_IDX = 9,
|
||||
CAP_OEM_INFO_IDX = 10,
|
||||
CAP_NR_IDX
|
||||
};
|
||||
|
||||
enum buf_index {
|
||||
BUF_STATUS_IDX = 0,
|
||||
BUF_EXT_STATUS_IDX = 1,
|
||||
BUF_ADDR_LOW_IDX = 2,
|
||||
BUF_ADDR_HI_IDX = 3,
|
||||
BUF_SIZE_IDX = 4,
|
||||
BUF_NR_IDX
|
||||
};
|
||||
|
||||
enum update_index {
|
||||
UPDATE_STATUS_IDX = 0,
|
||||
UPDATE_EXT_STATUS_IDX = 1,
|
||||
UPDATE_AUTH_TIME_LOW_IDX = 2,
|
||||
UPDATE_AUTH_TIME_HI_IDX = 3,
|
||||
UPDATE_EXEC_TIME_LOW_IDX = 4,
|
||||
UPDATE_EXEC_TIME_HI_IDX = 5,
|
||||
UPDATE_NR_IDX
|
||||
};
|
||||
|
||||
enum pfru_start_action {
|
||||
START_STAGE = 0,
|
||||
START_ACTIVATE = 1,
|
||||
START_STAGE_ACTIVATE = 2,
|
||||
};
|
||||
|
||||
struct pfru_device {
|
||||
u32 rev_id, index;
|
||||
struct device *parent_dev;
|
||||
struct miscdevice miscdev;
|
||||
};
|
||||
|
||||
static DEFINE_IDA(pfru_ida);
|
||||
|
||||
/*
|
||||
* Manual reference:
|
||||
* https://uefi.org/sites/default/files/resources/Intel_MM_OS_Interface_Spec_Rev100.pdf
|
||||
*
|
||||
* pfru_guid is the parameter for _DSM method
|
||||
*/
|
||||
static const guid_t pfru_guid =
|
||||
GUID_INIT(0xECF9533B, 0x4A3C, 0x4E89, 0x93, 0x9E, 0xC7, 0x71,
|
||||
0x12, 0x60, 0x1C, 0x6D);
|
||||
|
||||
/* pfru_code_inj_guid is the UUID to identify code injection EFI capsule file */
|
||||
static const guid_t pfru_code_inj_guid =
|
||||
GUID_INIT(0xB2F84B79, 0x7B6E, 0x4E45, 0x88, 0x5F, 0x3F, 0xB9,
|
||||
0xBB, 0x18, 0x54, 0x02);
|
||||
|
||||
/* pfru_drv_update_guid is the UUID to identify driver update EFI capsule file */
|
||||
static const guid_t pfru_drv_update_guid =
|
||||
GUID_INIT(0x4569DD8C, 0x75F1, 0x429A, 0xA3, 0xD6, 0x24, 0xDE,
|
||||
0x80, 0x97, 0xA0, 0xDF);
|
||||
|
||||
static inline int pfru_valid_revid(u32 id)
|
||||
{
|
||||
return id == PFRU_REVID_1 || id == PFRU_REVID_2;
|
||||
}
|
||||
|
||||
static inline struct pfru_device *to_pfru_dev(struct file *file)
|
||||
{
|
||||
return container_of(file->private_data, struct pfru_device, miscdev);
|
||||
}
|
||||
|
||||
static int query_capability(struct pfru_update_cap_info *cap_hdr,
|
||||
struct pfru_device *pfru_dev)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(pfru_dev->parent_dev);
|
||||
union acpi_object *out_obj;
|
||||
int ret = -EINVAL;
|
||||
|
||||
out_obj = acpi_evaluate_dsm_typed(handle, &pfru_guid,
|
||||
pfru_dev->rev_id,
|
||||
PFRU_FUNC_QUERY_UPDATE_CAP,
|
||||
NULL, ACPI_TYPE_PACKAGE);
|
||||
if (!out_obj)
|
||||
return ret;
|
||||
|
||||
if (out_obj->package.count < CAP_NR_IDX ||
|
||||
out_obj->package.elements[CAP_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[CAP_UPDATE_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[CAP_CODE_TYPE_IDX].type != ACPI_TYPE_BUFFER ||
|
||||
out_obj->package.elements[CAP_FW_VER_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[CAP_CODE_RT_VER_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[CAP_DRV_TYPE_IDX].type != ACPI_TYPE_BUFFER ||
|
||||
out_obj->package.elements[CAP_DRV_RT_VER_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[CAP_DRV_SVN_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[CAP_PLAT_ID_IDX].type != ACPI_TYPE_BUFFER ||
|
||||
out_obj->package.elements[CAP_OEM_ID_IDX].type != ACPI_TYPE_BUFFER ||
|
||||
out_obj->package.elements[CAP_OEM_INFO_IDX].type != ACPI_TYPE_BUFFER)
|
||||
goto free_acpi_buffer;
|
||||
|
||||
cap_hdr->status = out_obj->package.elements[CAP_STATUS_IDX].integer.value;
|
||||
if (cap_hdr->status != DSM_SUCCEED) {
|
||||
ret = -EBUSY;
|
||||
dev_dbg(pfru_dev->parent_dev, "Error Status:%d\n", cap_hdr->status);
|
||||
goto free_acpi_buffer;
|
||||
}
|
||||
|
||||
cap_hdr->update_cap = out_obj->package.elements[CAP_UPDATE_IDX].integer.value;
|
||||
memcpy(&cap_hdr->code_type,
|
||||
out_obj->package.elements[CAP_CODE_TYPE_IDX].buffer.pointer,
|
||||
out_obj->package.elements[CAP_CODE_TYPE_IDX].buffer.length);
|
||||
cap_hdr->fw_version =
|
||||
out_obj->package.elements[CAP_FW_VER_IDX].integer.value;
|
||||
cap_hdr->code_rt_version =
|
||||
out_obj->package.elements[CAP_CODE_RT_VER_IDX].integer.value;
|
||||
memcpy(&cap_hdr->drv_type,
|
||||
out_obj->package.elements[CAP_DRV_TYPE_IDX].buffer.pointer,
|
||||
out_obj->package.elements[CAP_DRV_TYPE_IDX].buffer.length);
|
||||
cap_hdr->drv_rt_version =
|
||||
out_obj->package.elements[CAP_DRV_RT_VER_IDX].integer.value;
|
||||
cap_hdr->drv_svn =
|
||||
out_obj->package.elements[CAP_DRV_SVN_IDX].integer.value;
|
||||
memcpy(&cap_hdr->platform_id,
|
||||
out_obj->package.elements[CAP_PLAT_ID_IDX].buffer.pointer,
|
||||
out_obj->package.elements[CAP_PLAT_ID_IDX].buffer.length);
|
||||
memcpy(&cap_hdr->oem_id,
|
||||
out_obj->package.elements[CAP_OEM_ID_IDX].buffer.pointer,
|
||||
out_obj->package.elements[CAP_OEM_ID_IDX].buffer.length);
|
||||
cap_hdr->oem_info_len =
|
||||
out_obj->package.elements[CAP_OEM_INFO_IDX].buffer.length;
|
||||
|
||||
ret = 0;
|
||||
|
||||
free_acpi_buffer:
|
||||
kfree(out_obj);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int query_buffer(struct pfru_com_buf_info *info,
|
||||
struct pfru_device *pfru_dev)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(pfru_dev->parent_dev);
|
||||
union acpi_object *out_obj;
|
||||
int ret = -EINVAL;
|
||||
|
||||
out_obj = acpi_evaluate_dsm_typed(handle, &pfru_guid,
|
||||
pfru_dev->rev_id, PFRU_FUNC_QUERY_BUF,
|
||||
NULL, ACPI_TYPE_PACKAGE);
|
||||
if (!out_obj)
|
||||
return ret;
|
||||
|
||||
if (out_obj->package.count < BUF_NR_IDX ||
|
||||
out_obj->package.elements[BUF_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[BUF_EXT_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[BUF_ADDR_LOW_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[BUF_ADDR_HI_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[BUF_SIZE_IDX].type != ACPI_TYPE_INTEGER)
|
||||
goto free_acpi_buffer;
|
||||
|
||||
info->status = out_obj->package.elements[BUF_STATUS_IDX].integer.value;
|
||||
info->ext_status =
|
||||
out_obj->package.elements[BUF_EXT_STATUS_IDX].integer.value;
|
||||
if (info->status != DSM_SUCCEED) {
|
||||
ret = -EBUSY;
|
||||
dev_dbg(pfru_dev->parent_dev, "Error Status:%d\n", info->status);
|
||||
dev_dbg(pfru_dev->parent_dev, "Error Extended Status:%d\n", info->ext_status);
|
||||
|
||||
goto free_acpi_buffer;
|
||||
}
|
||||
|
||||
info->addr_lo =
|
||||
out_obj->package.elements[BUF_ADDR_LOW_IDX].integer.value;
|
||||
info->addr_hi =
|
||||
out_obj->package.elements[BUF_ADDR_HI_IDX].integer.value;
|
||||
info->buf_size = out_obj->package.elements[BUF_SIZE_IDX].integer.value;
|
||||
|
||||
ret = 0;
|
||||
|
||||
free_acpi_buffer:
|
||||
kfree(out_obj);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_image_type(const struct efi_manage_capsule_image_header *img_hdr,
|
||||
struct pfru_device *pfru_dev)
|
||||
{
|
||||
const efi_guid_t *image_type_id = &img_hdr->image_type_id;
|
||||
|
||||
/* check whether this is a code injection or driver update */
|
||||
if (guid_equal(image_type_id, &pfru_code_inj_guid))
|
||||
return PFRU_CODE_INJECT_TYPE;
|
||||
|
||||
if (guid_equal(image_type_id, &pfru_drv_update_guid))
|
||||
return PFRU_DRIVER_UPDATE_TYPE;
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int adjust_efi_size(const struct efi_manage_capsule_image_header *img_hdr,
|
||||
int size)
|
||||
{
|
||||
/*
|
||||
* The (u64 hw_ins) was introduced in UEFI spec version 2,
|
||||
* and (u64 capsule_support) was introduced in version 3.
|
||||
* The size needs to be adjusted accordingly. That is to
|
||||
* say, version 1 should subtract the size of hw_ins+capsule_support,
|
||||
* and version 2 should sbstract the size of capsule_support.
|
||||
*/
|
||||
size += sizeof(struct efi_manage_capsule_image_header);
|
||||
switch (img_hdr->ver) {
|
||||
case 1:
|
||||
return size - 2 * sizeof(u64);
|
||||
|
||||
case 2:
|
||||
return size - sizeof(u64);
|
||||
|
||||
default:
|
||||
/* only support version 1 and 2 */
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static bool applicable_image(const void *data, struct pfru_update_cap_info *cap,
|
||||
struct pfru_device *pfru_dev)
|
||||
{
|
||||
struct pfru_payload_hdr *payload_hdr;
|
||||
const efi_capsule_header_t *cap_hdr = data;
|
||||
const struct efi_manage_capsule_header *m_hdr;
|
||||
const struct efi_manage_capsule_image_header *m_img_hdr;
|
||||
const struct efi_image_auth *auth;
|
||||
int type, size;
|
||||
|
||||
/*
|
||||
* If the code in the capsule is older than the current
|
||||
* firmware code, the update will be rejected by the firmware,
|
||||
* so check the version of it upfront without engaging the
|
||||
* Management Mode update mechanism which may be costly.
|
||||
*/
|
||||
size = cap_hdr->headersize;
|
||||
m_hdr = data + size;
|
||||
/*
|
||||
* Current data structure size plus variable array indicated
|
||||
* by number of (emb_drv_cnt + payload_cnt)
|
||||
*/
|
||||
size += offsetof(struct efi_manage_capsule_header, offset_list) +
|
||||
(m_hdr->emb_drv_cnt + m_hdr->payload_cnt) * sizeof(u64);
|
||||
m_img_hdr = data + size;
|
||||
|
||||
type = get_image_type(m_img_hdr, pfru_dev);
|
||||
if (type < 0)
|
||||
return false;
|
||||
|
||||
size = adjust_efi_size(m_img_hdr, size);
|
||||
if (size < 0)
|
||||
return false;
|
||||
|
||||
auth = data + size;
|
||||
size += sizeof(u64) + auth->auth_info.hdr.len;
|
||||
payload_hdr = (struct pfru_payload_hdr *)(data + size);
|
||||
|
||||
/* finally compare the version */
|
||||
if (type == PFRU_CODE_INJECT_TYPE)
|
||||
return payload_hdr->rt_ver >= cap->code_rt_version;
|
||||
|
||||
return payload_hdr->rt_ver >= cap->drv_rt_version;
|
||||
}
|
||||
|
||||
static void print_update_debug_info(struct pfru_updated_result *result,
|
||||
struct pfru_device *pfru_dev)
|
||||
{
|
||||
dev_dbg(pfru_dev->parent_dev, "Update result:\n");
|
||||
dev_dbg(pfru_dev->parent_dev, "Authentication Time Low:%lld\n",
|
||||
result->low_auth_time);
|
||||
dev_dbg(pfru_dev->parent_dev, "Authentication Time High:%lld\n",
|
||||
result->high_auth_time);
|
||||
dev_dbg(pfru_dev->parent_dev, "Execution Time Low:%lld\n",
|
||||
result->low_exec_time);
|
||||
dev_dbg(pfru_dev->parent_dev, "Execution Time High:%lld\n",
|
||||
result->high_exec_time);
|
||||
}
|
||||
|
||||
static int start_update(int action, struct pfru_device *pfru_dev)
|
||||
{
|
||||
union acpi_object *out_obj, in_obj, in_buf;
|
||||
struct pfru_updated_result update_result;
|
||||
acpi_handle handle;
|
||||
int ret = -EINVAL;
|
||||
|
||||
memset(&in_obj, 0, sizeof(in_obj));
|
||||
memset(&in_buf, 0, sizeof(in_buf));
|
||||
in_obj.type = ACPI_TYPE_PACKAGE;
|
||||
in_obj.package.count = 1;
|
||||
in_obj.package.elements = &in_buf;
|
||||
in_buf.type = ACPI_TYPE_INTEGER;
|
||||
in_buf.integer.value = action;
|
||||
|
||||
handle = ACPI_HANDLE(pfru_dev->parent_dev);
|
||||
out_obj = acpi_evaluate_dsm_typed(handle, &pfru_guid,
|
||||
pfru_dev->rev_id, PFRU_FUNC_START,
|
||||
&in_obj, ACPI_TYPE_PACKAGE);
|
||||
if (!out_obj)
|
||||
return ret;
|
||||
|
||||
if (out_obj->package.count < UPDATE_NR_IDX ||
|
||||
out_obj->package.elements[UPDATE_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[UPDATE_EXT_STATUS_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[UPDATE_AUTH_TIME_LOW_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[UPDATE_AUTH_TIME_HI_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[UPDATE_EXEC_TIME_LOW_IDX].type != ACPI_TYPE_INTEGER ||
|
||||
out_obj->package.elements[UPDATE_EXEC_TIME_HI_IDX].type != ACPI_TYPE_INTEGER)
|
||||
goto free_acpi_buffer;
|
||||
|
||||
update_result.status =
|
||||
out_obj->package.elements[UPDATE_STATUS_IDX].integer.value;
|
||||
update_result.ext_status =
|
||||
out_obj->package.elements[UPDATE_EXT_STATUS_IDX].integer.value;
|
||||
|
||||
if (update_result.status != DSM_SUCCEED) {
|
||||
ret = -EBUSY;
|
||||
dev_dbg(pfru_dev->parent_dev, "Error Status:%d\n", update_result.status);
|
||||
dev_dbg(pfru_dev->parent_dev, "Error Extended Status:%d\n",
|
||||
update_result.ext_status);
|
||||
|
||||
goto free_acpi_buffer;
|
||||
}
|
||||
|
||||
update_result.low_auth_time =
|
||||
out_obj->package.elements[UPDATE_AUTH_TIME_LOW_IDX].integer.value;
|
||||
update_result.high_auth_time =
|
||||
out_obj->package.elements[UPDATE_AUTH_TIME_HI_IDX].integer.value;
|
||||
update_result.low_exec_time =
|
||||
out_obj->package.elements[UPDATE_EXEC_TIME_LOW_IDX].integer.value;
|
||||
update_result.high_exec_time =
|
||||
out_obj->package.elements[UPDATE_EXEC_TIME_HI_IDX].integer.value;
|
||||
|
||||
print_update_debug_info(&update_result, pfru_dev);
|
||||
ret = 0;
|
||||
|
||||
free_acpi_buffer:
|
||||
kfree(out_obj);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long pfru_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct pfru_update_cap_info cap_hdr;
|
||||
struct pfru_device *pfru_dev = to_pfru_dev(file);
|
||||
void __user *p = (void __user *)arg;
|
||||
u32 rev;
|
||||
int ret;
|
||||
|
||||
switch (cmd) {
|
||||
case PFRU_IOC_QUERY_CAP:
|
||||
ret = query_capability(&cap_hdr, pfru_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (copy_to_user(p, &cap_hdr, sizeof(cap_hdr)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
|
||||
case PFRU_IOC_SET_REV:
|
||||
if (copy_from_user(&rev, p, sizeof(rev)))
|
||||
return -EFAULT;
|
||||
|
||||
if (!pfru_valid_revid(rev))
|
||||
return -EINVAL;
|
||||
|
||||
pfru_dev->rev_id = rev;
|
||||
|
||||
return 0;
|
||||
|
||||
case PFRU_IOC_STAGE:
|
||||
return start_update(START_STAGE, pfru_dev);
|
||||
|
||||
case PFRU_IOC_ACTIVATE:
|
||||
return start_update(START_ACTIVATE, pfru_dev);
|
||||
|
||||
case PFRU_IOC_STAGE_ACTIVATE:
|
||||
return start_update(START_STAGE_ACTIVATE, pfru_dev);
|
||||
|
||||
default:
|
||||
return -ENOTTY;
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t pfru_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
struct pfru_device *pfru_dev = to_pfru_dev(file);
|
||||
struct pfru_update_cap_info cap;
|
||||
struct pfru_com_buf_info buf_info;
|
||||
phys_addr_t phy_addr;
|
||||
struct iov_iter iter;
|
||||
struct iovec iov;
|
||||
char *buf_ptr;
|
||||
int ret;
|
||||
|
||||
ret = query_buffer(&buf_info, pfru_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (len > buf_info.buf_size)
|
||||
return -EINVAL;
|
||||
|
||||
iov.iov_base = (void __user *)buf;
|
||||
iov.iov_len = len;
|
||||
iov_iter_init(&iter, WRITE, &iov, 1, len);
|
||||
|
||||
/* map the communication buffer */
|
||||
phy_addr = (phys_addr_t)((buf_info.addr_hi << 32) | buf_info.addr_lo);
|
||||
buf_ptr = memremap(phy_addr, buf_info.buf_size, MEMREMAP_WB);
|
||||
if (!buf_ptr)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!copy_from_iter_full(buf_ptr, len, &iter)) {
|
||||
ret = -EINVAL;
|
||||
goto unmap;
|
||||
}
|
||||
|
||||
/* check if the capsule header has a valid version number */
|
||||
ret = query_capability(&cap, pfru_dev);
|
||||
if (ret)
|
||||
goto unmap;
|
||||
|
||||
if (!applicable_image(buf_ptr, &cap, pfru_dev))
|
||||
ret = -EINVAL;
|
||||
|
||||
unmap:
|
||||
memunmap(buf_ptr);
|
||||
|
||||
return ret ?: len;
|
||||
}
|
||||
|
||||
static const struct file_operations acpi_pfru_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.write = pfru_write,
|
||||
.unlocked_ioctl = pfru_ioctl,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
static int acpi_pfru_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pfru_device *pfru_dev = platform_get_drvdata(pdev);
|
||||
|
||||
misc_deregister(&pfru_dev->miscdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pfru_put_idx(void *data)
|
||||
{
|
||||
struct pfru_device *pfru_dev = data;
|
||||
|
||||
ida_free(&pfru_ida, pfru_dev->index);
|
||||
}
|
||||
|
||||
static int acpi_pfru_probe(struct platform_device *pdev)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(&pdev->dev);
|
||||
struct pfru_device *pfru_dev;
|
||||
int ret;
|
||||
|
||||
if (!acpi_has_method(handle, "_DSM")) {
|
||||
dev_dbg(&pdev->dev, "Missing _DSM\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pfru_dev = devm_kzalloc(&pdev->dev, sizeof(*pfru_dev), GFP_KERNEL);
|
||||
if (!pfru_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = ida_alloc(&pfru_ida, GFP_KERNEL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
pfru_dev->index = ret;
|
||||
ret = devm_add_action_or_reset(&pdev->dev, pfru_put_idx, pfru_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pfru_dev->rev_id = PFRU_DEFAULT_REV_ID;
|
||||
pfru_dev->parent_dev = &pdev->dev;
|
||||
|
||||
pfru_dev->miscdev.minor = MISC_DYNAMIC_MINOR;
|
||||
pfru_dev->miscdev.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||
"pfru%d", pfru_dev->index);
|
||||
if (!pfru_dev->miscdev.name)
|
||||
return -ENOMEM;
|
||||
|
||||
pfru_dev->miscdev.nodename = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||
"acpi_pfr_update%d", pfru_dev->index);
|
||||
if (!pfru_dev->miscdev.nodename)
|
||||
return -ENOMEM;
|
||||
|
||||
pfru_dev->miscdev.fops = &acpi_pfru_fops;
|
||||
pfru_dev->miscdev.parent = &pdev->dev;
|
||||
|
||||
ret = misc_register(&pfru_dev->miscdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
platform_set_drvdata(pdev, pfru_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id acpi_pfru_ids[] = {
|
||||
{"INTC1080"},
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, acpi_pfru_ids);
|
||||
|
||||
static struct platform_driver acpi_pfru_driver = {
|
||||
.driver = {
|
||||
.name = "pfr_update",
|
||||
.acpi_match_table = acpi_pfru_ids,
|
||||
},
|
||||
.probe = acpi_pfru_probe,
|
||||
.remove = acpi_pfru_remove,
|
||||
};
|
||||
module_platform_driver(acpi_pfru_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Platform Firmware Runtime Update device driver");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -2502,42 +2502,33 @@ int acpi_bus_register_early_device(int type)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_bus_register_early_device);
|
||||
|
||||
static int acpi_bus_scan_fixed(void)
|
||||
static void acpi_bus_scan_fixed(void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
/*
|
||||
* Enumerate all fixed-feature devices.
|
||||
*/
|
||||
if (!(acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON)) {
|
||||
struct acpi_device *device = NULL;
|
||||
struct acpi_device *adev = NULL;
|
||||
|
||||
result = acpi_add_single_object(&device, NULL,
|
||||
ACPI_BUS_TYPE_POWER_BUTTON, false);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
device->flags.match_driver = true;
|
||||
result = device_attach(&device->dev);
|
||||
if (result < 0)
|
||||
return result;
|
||||
|
||||
device_init_wakeup(&device->dev, true);
|
||||
acpi_add_single_object(&adev, NULL, ACPI_BUS_TYPE_POWER_BUTTON,
|
||||
false);
|
||||
if (adev) {
|
||||
adev->flags.match_driver = true;
|
||||
if (device_attach(&adev->dev) >= 0)
|
||||
device_init_wakeup(&adev->dev, true);
|
||||
else
|
||||
dev_dbg(&adev->dev, "No driver\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (!(acpi_gbl_FADT.flags & ACPI_FADT_SLEEP_BUTTON)) {
|
||||
struct acpi_device *device = NULL;
|
||||
struct acpi_device *adev = NULL;
|
||||
|
||||
result = acpi_add_single_object(&device, NULL,
|
||||
ACPI_BUS_TYPE_SLEEP_BUTTON, false);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
device->flags.match_driver = true;
|
||||
result = device_attach(&device->dev);
|
||||
acpi_add_single_object(&adev, NULL, ACPI_BUS_TYPE_SLEEP_BUTTON,
|
||||
false);
|
||||
if (adev) {
|
||||
adev->flags.match_driver = true;
|
||||
if (device_attach(&adev->dev) < 0)
|
||||
dev_dbg(&adev->dev, "No driver\n");
|
||||
}
|
||||
}
|
||||
|
||||
return result < 0 ? result : 0;
|
||||
}
|
||||
|
||||
static void __init acpi_get_spcr_uart_addr(void)
|
||||
@ -2558,9 +2549,8 @@ static void __init acpi_get_spcr_uart_addr(void)
|
||||
|
||||
static bool acpi_scan_initialized;
|
||||
|
||||
int __init acpi_scan_init(void)
|
||||
void __init acpi_scan_init(void)
|
||||
{
|
||||
int result;
|
||||
acpi_status status;
|
||||
struct acpi_table_stao *stao_ptr;
|
||||
|
||||
@ -2610,33 +2600,23 @@ int __init acpi_scan_init(void)
|
||||
/*
|
||||
* Enumerate devices in the ACPI namespace.
|
||||
*/
|
||||
result = acpi_bus_scan(ACPI_ROOT_OBJECT);
|
||||
if (result)
|
||||
goto out;
|
||||
if (acpi_bus_scan(ACPI_ROOT_OBJECT))
|
||||
goto unlock;
|
||||
|
||||
acpi_root = acpi_fetch_acpi_dev(ACPI_ROOT_OBJECT);
|
||||
if (!acpi_root)
|
||||
goto out;
|
||||
goto unlock;
|
||||
|
||||
/* Fixed feature devices do not exist on HW-reduced platform */
|
||||
if (!acpi_gbl_reduced_hardware) {
|
||||
result = acpi_bus_scan_fixed();
|
||||
if (result) {
|
||||
acpi_detach_data(acpi_root->handle,
|
||||
acpi_scan_drop_device);
|
||||
acpi_device_del(acpi_root);
|
||||
acpi_bus_put_acpi_device(acpi_root);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
if (!acpi_gbl_reduced_hardware)
|
||||
acpi_bus_scan_fixed();
|
||||
|
||||
acpi_turn_off_unused_power_resources();
|
||||
|
||||
acpi_scan_initialized = true;
|
||||
|
||||
out:
|
||||
unlock:
|
||||
mutex_unlock(&acpi_scan_lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
static struct acpi_probe_entry *ape;
|
||||
|
@ -107,8 +107,13 @@ int __init acpi_parse_spcr(bool enable_earlycon, bool enable_console)
|
||||
pr_info("SPCR table version %d\n", table->header.revision);
|
||||
|
||||
if (table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
|
||||
switch (ACPI_ACCESS_BIT_WIDTH((
|
||||
table->serial_port.access_width))) {
|
||||
u32 bit_width = table->serial_port.access_width;
|
||||
|
||||
if (bit_width > ACPI_ACCESS_BIT_MAX) {
|
||||
pr_err("Unacceptable wide SPCR Access Width. Defaulting to byte size\n");
|
||||
bit_width = ACPI_ACCESS_BIT_DEFAULT;
|
||||
}
|
||||
switch (ACPI_ACCESS_BIT_WIDTH((bit_width))) {
|
||||
default:
|
||||
pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n");
|
||||
fallthrough;
|
||||
|
@ -146,7 +146,7 @@ config SATA_AHCI_PLATFORM
|
||||
config AHCI_BRCM
|
||||
tristate "Broadcom AHCI SATA support"
|
||||
depends on ARCH_BRCMSTB || BMIPS_GENERIC || ARCH_BCM_NSP || \
|
||||
ARCH_BCM_63XX
|
||||
ARCH_BCM_63XX || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the AHCI SATA3 controller found on
|
||||
@ -156,7 +156,7 @@ config AHCI_BRCM
|
||||
|
||||
config AHCI_DA850
|
||||
tristate "DaVinci DA850 AHCI SATA support"
|
||||
depends on ARCH_DAVINCI_DA850
|
||||
depends on ARCH_DAVINCI_DA850 || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the DaVinci DA850 SoC's
|
||||
@ -166,7 +166,7 @@ config AHCI_DA850
|
||||
|
||||
config AHCI_DM816
|
||||
tristate "DaVinci DM816 AHCI SATA support"
|
||||
depends on ARCH_OMAP2PLUS
|
||||
depends on ARCH_OMAP2PLUS || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the DaVinci DM816 SoC's
|
||||
@ -206,7 +206,7 @@ config AHCI_CEVA
|
||||
|
||||
config AHCI_MTK
|
||||
tristate "MediaTek AHCI SATA support"
|
||||
depends on ARCH_MEDIATEK
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
select MFD_SYSCON
|
||||
select SATA_HOST
|
||||
help
|
||||
@ -217,7 +217,7 @@ config AHCI_MTK
|
||||
|
||||
config AHCI_MVEBU
|
||||
tristate "Marvell EBU AHCI SATA support"
|
||||
depends on ARCH_MVEBU
|
||||
depends on ARCH_MVEBU || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the Marvebu EBU SoC's
|
||||
@ -236,7 +236,7 @@ config AHCI_OCTEON
|
||||
|
||||
config AHCI_SUNXI
|
||||
tristate "Allwinner sunxi AHCI SATA support"
|
||||
depends on ARCH_SUNXI
|
||||
depends on ARCH_SUNXI || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the Allwinner sunxi SoC's
|
||||
@ -246,7 +246,7 @@ config AHCI_SUNXI
|
||||
|
||||
config AHCI_TEGRA
|
||||
tristate "NVIDIA Tegra AHCI SATA support"
|
||||
depends on ARCH_TEGRA
|
||||
depends on ARCH_TEGRA || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for the NVIDIA Tegra SoC's
|
||||
@ -256,7 +256,7 @@ config AHCI_TEGRA
|
||||
|
||||
config AHCI_XGENE
|
||||
tristate "APM X-Gene 6.0Gbps AHCI SATA host controller support"
|
||||
depends on PHY_XGENE
|
||||
depends on PHY_XGENE || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for APM X-Gene SoC SATA host controller.
|
||||
@ -273,7 +273,7 @@ config AHCI_QORIQ
|
||||
|
||||
config SATA_FSL
|
||||
tristate "Freescale 3.0Gbps SATA support"
|
||||
depends on FSL_SOC
|
||||
depends on FSL_SOC || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for Freescale 3.0Gbps SATA controller.
|
||||
@ -294,7 +294,7 @@ config SATA_GEMINI
|
||||
|
||||
config SATA_AHCI_SEATTLE
|
||||
tristate "AMD Seattle 6.0Gbps AHCI SATA host controller support"
|
||||
depends on ARCH_SEATTLE
|
||||
depends on ARCH_SEATTLE || COMPILE_TEST
|
||||
select SATA_HOST
|
||||
help
|
||||
This option enables support for AMD Seattle SATA host controller.
|
||||
@ -432,18 +432,6 @@ config SATA_DWC_OLD_DMA
|
||||
This option enables support for old device trees without the
|
||||
"dmas" property.
|
||||
|
||||
config SATA_DWC_DEBUG
|
||||
bool "Debugging driver version"
|
||||
depends on SATA_DWC
|
||||
help
|
||||
This option enables debugging output in the driver.
|
||||
|
||||
config SATA_DWC_VDEBUG
|
||||
bool "Verbose debug output"
|
||||
depends on SATA_DWC_DEBUG
|
||||
help
|
||||
This option enables the taskfile dumping and NCQ debugging.
|
||||
|
||||
config SATA_HIGHBANK
|
||||
tristate "Calxeda Highbank SATA support"
|
||||
depends on ARCH_HIGHBANK || COMPILE_TEST
|
||||
@ -611,7 +599,7 @@ config PATA_ATP867X
|
||||
|
||||
config PATA_BK3710
|
||||
tristate "Palmchip BK3710 PATA support"
|
||||
depends on ARCH_DAVINCI
|
||||
depends on ARCH_DAVINCI || COMPILE_TEST
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the integrated IDE controller on
|
||||
@ -649,7 +637,7 @@ config PATA_CS5530
|
||||
|
||||
config PATA_CS5535
|
||||
tristate "CS5535 PATA support (Experimental)"
|
||||
depends on PCI && X86_32
|
||||
depends on PCI && (X86_32 || (X86_64 && COMPILE_TEST))
|
||||
help
|
||||
This option enables support for the NatSemi/AMD CS5535
|
||||
companion chip used with the Geode processor family.
|
||||
@ -697,7 +685,7 @@ config PATA_EP93XX
|
||||
config PATA_FTIDE010
|
||||
tristate "Faraday Technology FTIDE010 PATA support"
|
||||
depends on OF
|
||||
depends on ARM
|
||||
depends on ARM || COMPILE_TEST
|
||||
depends on SATA_GEMINI
|
||||
help
|
||||
This option enables support for the Faraday FTIDE010
|
||||
@ -760,7 +748,7 @@ config PATA_ICSIDE
|
||||
|
||||
config PATA_IMX
|
||||
tristate "PATA support for Freescale iMX"
|
||||
depends on ARCH_MXC
|
||||
depends on ARCH_MXC || COMPILE_TEST
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables support for the PATA host available on Freescale
|
||||
@ -981,7 +969,7 @@ config PATA_VIA
|
||||
|
||||
config PATA_PXA
|
||||
tristate "PXA DMA-capable PATA support"
|
||||
depends on ARCH_PXA
|
||||
depends on ARCH_PXA || COMPILE_TEST
|
||||
help
|
||||
This option enables support for harddrive attached to PXA CPU's bus.
|
||||
|
||||
@ -1157,7 +1145,7 @@ config PATA_RZ1000
|
||||
|
||||
config PATA_SAMSUNG_CF
|
||||
tristate "Samsung SoC PATA support"
|
||||
depends on SAMSUNG_DEV_IDE
|
||||
depends on SAMSUNG_DEV_IDE || COMPILE_TEST
|
||||
select PATA_TIMINGS
|
||||
help
|
||||
This option enables basic support for Samsung's S3C/S5P board
|
||||
|
@ -185,8 +185,6 @@ static unsigned int acard_ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl)
|
||||
struct acard_sg *acard_sg = cmd_tbl + AHCI_CMD_TBL_HDR_SZ;
|
||||
unsigned int si, last_si = 0;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
/*
|
||||
* Next, the S/G list.
|
||||
*/
|
||||
@ -362,8 +360,6 @@ static int acard_ahci_init_one(struct pci_dev *pdev, const struct pci_device_id
|
||||
struct ata_host *host;
|
||||
int n_ports, i, rc;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
WARN_ON((int)ATA_MAX_QUEUE > AHCI_MAX_CMDS);
|
||||
|
||||
ata_print_version_once(&pdev->dev, DRV_VERSION);
|
||||
|
@ -51,6 +51,7 @@ enum board_ids {
|
||||
board_ahci,
|
||||
board_ahci_ign_iferr,
|
||||
board_ahci_mobile,
|
||||
board_ahci_no_debounce_delay,
|
||||
board_ahci_nomsi,
|
||||
board_ahci_noncq,
|
||||
board_ahci_nosntf,
|
||||
@ -141,6 +142,13 @@ static const struct ata_port_info ahci_port_info[] = {
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_ops,
|
||||
},
|
||||
[board_ahci_no_debounce_delay] = {
|
||||
.flags = AHCI_FLAG_COMMON,
|
||||
.link_flags = ATA_LFLAG_NO_DEBOUNCE_DELAY,
|
||||
.pio_mask = ATA_PIO4,
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_ops,
|
||||
},
|
||||
[board_ahci_nomsi] = {
|
||||
AHCI_HFLAGS (AHCI_HFLAG_NO_MSI),
|
||||
.flags = AHCI_FLAG_COMMON,
|
||||
@ -437,6 +445,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
board_ahci_al },
|
||||
/* AMD */
|
||||
{ PCI_VDEVICE(AMD, 0x7800), board_ahci }, /* AMD Hudson-2 */
|
||||
{ PCI_VDEVICE(AMD, 0x7801), board_ahci_no_debounce_delay }, /* AMD Hudson-2 (AHCI mode) */
|
||||
{ PCI_VDEVICE(AMD, 0x7900), board_ahci }, /* AMD CZ */
|
||||
{ PCI_VDEVICE(AMD, 0x7901), board_ahci_mobile }, /* AMD Green Sardine */
|
||||
/* AMD is using RAID class only for ahci controllers */
|
||||
@ -684,7 +693,7 @@ static void ahci_pci_init_controller(struct ata_host *host)
|
||||
|
||||
/* clear port IRQ */
|
||||
tmp = readl(port_mmio + PORT_IRQ_STAT);
|
||||
VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
|
||||
dev_dbg(&pdev->dev, "PORT_IRQ_STAT 0x%x\n", tmp);
|
||||
if (tmp)
|
||||
writel(tmp, port_mmio + PORT_IRQ_STAT);
|
||||
}
|
||||
@ -700,8 +709,6 @@ static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
|
||||
bool online;
|
||||
int rc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
hpriv->stop_engine(ap);
|
||||
|
||||
rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
|
||||
@ -709,8 +716,6 @@ static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
|
||||
|
||||
hpriv->start_engine(ap);
|
||||
|
||||
DPRINTK("EXIT, rc=%d, class=%u\n", rc, *class);
|
||||
|
||||
/* vt8251 doesn't clear BSY on signature FIS reception,
|
||||
* request follow-up softreset.
|
||||
*/
|
||||
@ -790,8 +795,6 @@ static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
|
||||
bool online;
|
||||
int rc, i;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
hpriv->stop_engine(ap);
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
@ -829,7 +832,6 @@ static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
|
||||
if (online)
|
||||
*class = ahci_dev_classify(ap);
|
||||
|
||||
DPRINTK("EXIT, rc=%d, class=%u\n", rc, *class);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -1476,7 +1478,6 @@ static irqreturn_t ahci_thunderx_irq_handler(int irq, void *dev_instance)
|
||||
u32 irq_stat, irq_masked;
|
||||
unsigned int handled = 1;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
hpriv = host->private_data;
|
||||
mmio = hpriv->mmio;
|
||||
irq_stat = readl(mmio + HOST_IRQ_STAT);
|
||||
@ -1493,7 +1494,6 @@ static irqreturn_t ahci_thunderx_irq_handler(int irq, void *dev_instance)
|
||||
irq_stat = readl(mmio + HOST_IRQ_STAT);
|
||||
spin_unlock(&host->lock);
|
||||
} while (irq_stat);
|
||||
VPRINTK("EXIT\n");
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
@ -1657,7 +1657,7 @@ static ssize_t remapped_nvme_show(struct device *dev,
|
||||
struct ata_host *host = dev_get_drvdata(dev);
|
||||
struct ahci_host_priv *hpriv = host->private_data;
|
||||
|
||||
return sprintf(buf, "%u\n", hpriv->remapped_nvme);
|
||||
return sysfs_emit(buf, "%u\n", hpriv->remapped_nvme);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_RO(remapped_nvme);
|
||||
@ -1673,8 +1673,6 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
int n_ports, i, rc;
|
||||
int ahci_pci_bar = AHCI_PCI_BAR_STANDARD;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
WARN_ON((int)ATA_MAX_QUEUE > AHCI_MAX_CMDS);
|
||||
|
||||
ata_print_version_once(&pdev->dev, DRV_VERSION);
|
||||
|
@ -246,7 +246,7 @@ static void brcm_sata_init(struct brcm_ahci_priv *priv)
|
||||
}
|
||||
|
||||
static unsigned int brcm_ahci_read_id(struct ata_device *dev,
|
||||
struct ata_taskfile *tf, u16 *id)
|
||||
struct ata_taskfile *tf, __le16 *id)
|
||||
{
|
||||
struct ata_port *ap = dev->link->ap;
|
||||
struct ata_host *host = ap->host;
|
||||
@ -333,7 +333,7 @@ static struct ata_port_operations ahci_brcm_platform_ops = {
|
||||
|
||||
static const struct ata_port_info ahci_brcm_port_info = {
|
||||
.flags = AHCI_FLAG_COMMON | ATA_FLAG_NO_DIPM,
|
||||
.link_flags = ATA_LFLAG_NO_DB_DELAY,
|
||||
.link_flags = ATA_LFLAG_NO_DEBOUNCE_DELAY,
|
||||
.pio_mask = ATA_PIO4,
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_brcm_platform_ops,
|
||||
|
@ -92,9 +92,8 @@ struct ceva_ahci_priv {
|
||||
};
|
||||
|
||||
static unsigned int ceva_ahci_read_id(struct ata_device *dev,
|
||||
struct ata_taskfile *tf, u16 *id)
|
||||
struct ata_taskfile *tf, __le16 *id)
|
||||
{
|
||||
__le16 *__id = (__le16 *)id;
|
||||
u32 err_mask;
|
||||
|
||||
err_mask = ata_do_dev_read_id(dev, tf, id);
|
||||
@ -104,7 +103,7 @@ static unsigned int ceva_ahci_read_id(struct ata_device *dev,
|
||||
* Since CEVA controller does not support device sleep feature, we
|
||||
* need to clear DEVSLP (bit 8) in word78 of the IDENTIFY DEVICE data.
|
||||
*/
|
||||
__id[ATA_ID_FEATURE_SUPP] &= cpu_to_le16(~(1 << 8));
|
||||
id[ATA_ID_FEATURE_SUPP] &= cpu_to_le16(~(1 << 8));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -103,8 +103,6 @@ static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
|
||||
int rc;
|
||||
bool ls1021a_workaround = (qoriq_priv->type == AHCI_LS1021A);
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
hpriv->stop_engine(ap);
|
||||
|
||||
/*
|
||||
@ -146,8 +144,6 @@ static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
|
||||
|
||||
if (online)
|
||||
*class = ahci_dev_classify(ap);
|
||||
|
||||
DPRINTK("EXIT, rc=%d, class=%u\n", rc, *class);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -193,7 +193,7 @@ static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc)
|
||||
struct xgene_ahci_context *ctx = hpriv->plat_data;
|
||||
int rc = 0;
|
||||
u32 port_fbs;
|
||||
void *port_mmio = ahci_port_base(ap);
|
||||
void __iomem *port_mmio = ahci_port_base(ap);
|
||||
|
||||
/*
|
||||
* Write the pmp value to PxFBS.DEV
|
||||
@ -237,7 +237,7 @@ static bool xgene_ahci_is_memram_inited(struct xgene_ahci_context *ctx)
|
||||
* does not support DEVSLP.
|
||||
*/
|
||||
static unsigned int xgene_ahci_read_id(struct ata_device *dev,
|
||||
struct ata_taskfile *tf, u16 *id)
|
||||
struct ata_taskfile *tf, __le16 *id)
|
||||
{
|
||||
u32 err_mask;
|
||||
|
||||
@ -454,7 +454,7 @@ static int xgene_ahci_pmp_softreset(struct ata_link *link, unsigned int *class,
|
||||
int pmp = sata_srst_pmp(link);
|
||||
struct ata_port *ap = link->ap;
|
||||
u32 rc;
|
||||
void *port_mmio = ahci_port_base(ap);
|
||||
void __iomem *port_mmio = ahci_port_base(ap);
|
||||
u32 port_fbs;
|
||||
|
||||
/*
|
||||
@ -499,7 +499,7 @@ static int xgene_ahci_softreset(struct ata_link *link, unsigned int *class,
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||
struct xgene_ahci_context *ctx = hpriv->plat_data;
|
||||
void *port_mmio = ahci_port_base(ap);
|
||||
void __iomem *port_mmio = ahci_port_base(ap);
|
||||
u32 port_fbs;
|
||||
u32 port_fbs_save;
|
||||
u32 retry = 1;
|
||||
@ -588,8 +588,6 @@ static irqreturn_t xgene_ahci_irq_intr(int irq, void *dev_instance)
|
||||
void __iomem *mmio;
|
||||
u32 irq_stat, irq_masked;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
hpriv = host->private_data;
|
||||
mmio = hpriv->mmio;
|
||||
|
||||
@ -612,8 +610,6 @@ static irqreturn_t xgene_ahci_irq_intr(int irq, void *dev_instance)
|
||||
|
||||
spin_unlock(&host->lock);
|
||||
|
||||
VPRINTK("EXIT\n");
|
||||
|
||||
return IRQ_RETVAL(rc);
|
||||
}
|
||||
|
||||
|
@ -77,6 +77,7 @@
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <trace/events/libata.h>
|
||||
|
||||
#define DRV_NAME "ata_piix"
|
||||
#define DRV_VERSION "2.13"
|
||||
@ -816,10 +817,15 @@ static int piix_sidpr_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||
|
||||
static bool piix_irq_check(struct ata_port *ap)
|
||||
{
|
||||
unsigned char host_stat;
|
||||
|
||||
if (unlikely(!ap->ioaddr.bmdma_addr))
|
||||
return false;
|
||||
|
||||
return ap->ops->bmdma_status(ap) & ATA_DMA_INTR;
|
||||
host_stat = ap->ops->bmdma_status(ap);
|
||||
trace_ata_bmdma_status(ap, host_stat);
|
||||
|
||||
return host_stat & ATA_DMA_INTR;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -1345,7 +1351,6 @@ static void piix_init_pcs(struct ata_host *host,
|
||||
new_pcs = pcs | map_db->port_enable;
|
||||
|
||||
if (new_pcs != pcs) {
|
||||
DPRINTK("updating PCS from 0x%x to 0x%x\n", pcs, new_pcs);
|
||||
pci_write_config_word(pdev, ICH5_PCS, new_pcs);
|
||||
msleep(150);
|
||||
}
|
||||
@ -1769,14 +1774,12 @@ static int __init piix_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
DPRINTK("pci_register_driver\n");
|
||||
rc = pci_register_driver(&piix_pci_driver);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
in_module_init = 0;
|
||||
|
||||
DPRINTK("done\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1234,12 +1234,12 @@ static void ahci_port_init(struct device *dev, struct ata_port *ap,
|
||||
|
||||
/* clear SError */
|
||||
tmp = readl(port_mmio + PORT_SCR_ERR);
|
||||
VPRINTK("PORT_SCR_ERR 0x%x\n", tmp);
|
||||
dev_dbg(dev, "PORT_SCR_ERR 0x%x\n", tmp);
|
||||
writel(tmp, port_mmio + PORT_SCR_ERR);
|
||||
|
||||
/* clear port IRQ */
|
||||
tmp = readl(port_mmio + PORT_IRQ_STAT);
|
||||
VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
|
||||
dev_dbg(dev, "PORT_IRQ_STAT 0x%x\n", tmp);
|
||||
if (tmp)
|
||||
writel(tmp, port_mmio + PORT_IRQ_STAT);
|
||||
|
||||
@ -1270,10 +1270,10 @@ void ahci_init_controller(struct ata_host *host)
|
||||
}
|
||||
|
||||
tmp = readl(mmio + HOST_CTL);
|
||||
VPRINTK("HOST_CTL 0x%x\n", tmp);
|
||||
dev_dbg(host->dev, "HOST_CTL 0x%x\n", tmp);
|
||||
writel(tmp | HOST_IRQ_EN, mmio + HOST_CTL);
|
||||
tmp = readl(mmio + HOST_CTL);
|
||||
VPRINTK("HOST_CTL 0x%x\n", tmp);
|
||||
dev_dbg(host->dev, "HOST_CTL 0x%x\n", tmp);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_init_controller);
|
||||
|
||||
@ -1300,7 +1300,7 @@ unsigned int ahci_dev_classify(struct ata_port *ap)
|
||||
tf.lbal = (tmp >> 8) & 0xff;
|
||||
tf.nsect = (tmp) & 0xff;
|
||||
|
||||
return ata_dev_classify(&tf);
|
||||
return ata_port_classify(ap, &tf);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_dev_classify);
|
||||
|
||||
@ -1415,8 +1415,6 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class,
|
||||
bool fbs_disabled = false;
|
||||
int rc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
/* prepare for SRST (AHCI-1.1 10.4.1) */
|
||||
rc = ahci_kick_engine(ap);
|
||||
if (rc && rc != -EOPNOTSUPP)
|
||||
@ -1476,7 +1474,6 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class,
|
||||
if (fbs_disabled)
|
||||
ahci_enable_fbs(ap);
|
||||
|
||||
DPRINTK("EXIT, class=%u\n", *class);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
@ -1498,8 +1495,6 @@ static int ahci_softreset(struct ata_link *link, unsigned int *class,
|
||||
{
|
||||
int pmp = sata_srst_pmp(link);
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
return ahci_do_softreset(link, class, pmp, deadline, ahci_check_ready);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_do_softreset);
|
||||
@ -1529,8 +1524,6 @@ static int ahci_pmp_retry_softreset(struct ata_link *link, unsigned int *class,
|
||||
int rc;
|
||||
u32 irq_sts;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
rc = ahci_do_softreset(link, class, pmp, deadline,
|
||||
ahci_bad_pmp_check_ready);
|
||||
|
||||
@ -1564,8 +1557,6 @@ int ahci_do_hardreset(struct ata_link *link, unsigned int *class,
|
||||
struct ata_taskfile tf;
|
||||
int rc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
hpriv->stop_engine(ap);
|
||||
|
||||
/* clear D2H reception area to properly wait for D2H FIS */
|
||||
@ -1581,7 +1572,6 @@ int ahci_do_hardreset(struct ata_link *link, unsigned int *class,
|
||||
if (*online)
|
||||
*class = ahci_dev_classify(ap);
|
||||
|
||||
DPRINTK("EXIT, rc=%d, class=%u\n", rc, *class);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_do_hardreset);
|
||||
@ -1620,8 +1610,6 @@ static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl)
|
||||
struct ahci_sg *ahci_sg = cmd_tbl + AHCI_CMD_TBL_HDR_SZ;
|
||||
unsigned int si;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
/*
|
||||
* Next, the S/G list.
|
||||
*/
|
||||
@ -1695,7 +1683,6 @@ static void ahci_fbs_dec_intr(struct ata_port *ap)
|
||||
u32 fbs = readl(port_mmio + PORT_FBS);
|
||||
int retries = 3;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
BUG_ON(!pp->fbs_enabled);
|
||||
|
||||
/* time to wait for DEC is not specified by AHCI spec,
|
||||
@ -1924,8 +1911,6 @@ static irqreturn_t ahci_multi_irqs_intr_hard(int irq, void *dev_instance)
|
||||
void __iomem *port_mmio = ahci_port_base(ap);
|
||||
u32 status;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
status = readl(port_mmio + PORT_IRQ_STAT);
|
||||
writel(status, port_mmio + PORT_IRQ_STAT);
|
||||
|
||||
@ -1933,8 +1918,6 @@ static irqreturn_t ahci_multi_irqs_intr_hard(int irq, void *dev_instance)
|
||||
ahci_handle_port_interrupt(ap, port_mmio, status);
|
||||
spin_unlock(ap->lock);
|
||||
|
||||
VPRINTK("EXIT\n");
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@ -1951,9 +1934,7 @@ u32 ahci_handle_port_intr(struct ata_host *host, u32 irq_masked)
|
||||
ap = host->ports[i];
|
||||
if (ap) {
|
||||
ahci_port_intr(ap);
|
||||
VPRINTK("port %u\n", i);
|
||||
} else {
|
||||
VPRINTK("port %u (no irq)\n", i);
|
||||
if (ata_ratelimit())
|
||||
dev_warn(host->dev,
|
||||
"interrupt on disabled port %u\n", i);
|
||||
@ -1974,8 +1955,6 @@ static irqreturn_t ahci_single_level_irq_intr(int irq, void *dev_instance)
|
||||
void __iomem *mmio;
|
||||
u32 irq_stat, irq_masked;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
hpriv = host->private_data;
|
||||
mmio = hpriv->mmio;
|
||||
|
||||
@ -2003,8 +1982,6 @@ static irqreturn_t ahci_single_level_irq_intr(int irq, void *dev_instance)
|
||||
|
||||
spin_unlock(&host->lock);
|
||||
|
||||
VPRINTK("EXIT\n");
|
||||
|
||||
return IRQ_RETVAL(rc);
|
||||
}
|
||||
|
||||
|
@ -579,11 +579,8 @@ int ahci_platform_init_host(struct platform_device *pdev,
|
||||
int i, irq, n_ports, rc;
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
if (irq != -EPROBE_DEFER)
|
||||
dev_err(dev, "no irq\n");
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
}
|
||||
if (!irq)
|
||||
return -EINVAL;
|
||||
|
||||
@ -642,13 +639,8 @@ int ahci_platform_init_host(struct platform_device *pdev,
|
||||
if (hpriv->cap & HOST_CAP_64) {
|
||||
rc = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(64));
|
||||
if (rc) {
|
||||
rc = dma_coerce_mask_and_coherent(dev,
|
||||
DMA_BIT_MASK(32));
|
||||
if (rc) {
|
||||
dev_err(dev, "Failed to enable 64-bit DMA.\n");
|
||||
return rc;
|
||||
}
|
||||
dev_warn(dev, "Enable 32-bit DMA instead of 64-bit.\n");
|
||||
dev_err(dev, "Failed to enable 64-bit DMA.\n");
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -402,7 +402,6 @@ EXPORT_SYMBOL_GPL(ata_acpi_stm);
|
||||
*/
|
||||
static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf)
|
||||
{
|
||||
struct ata_port *ap = dev->link->ap;
|
||||
acpi_status status;
|
||||
struct acpi_buffer output;
|
||||
union acpi_object *out_obj;
|
||||
@ -418,10 +417,6 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf)
|
||||
output.length = ACPI_ALLOCATE_BUFFER;
|
||||
output.pointer = NULL; /* ACPI-CA sets this; save/free it later */
|
||||
|
||||
if (ata_msg_probe(ap))
|
||||
ata_dev_dbg(dev, "%s: ENTER: port#: %d\n",
|
||||
__func__, ap->port_no);
|
||||
|
||||
/* _GTF has no input parameters */
|
||||
status = acpi_evaluate_object(ata_dev_acpi_handle(dev), "_GTF", NULL,
|
||||
&output);
|
||||
@ -437,11 +432,9 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf)
|
||||
}
|
||||
|
||||
if (!output.length || !output.pointer) {
|
||||
if (ata_msg_probe(ap))
|
||||
ata_dev_dbg(dev, "%s: Run _GTF: length or ptr is NULL (0x%llx, 0x%p)\n",
|
||||
__func__,
|
||||
(unsigned long long)output.length,
|
||||
output.pointer);
|
||||
ata_dev_dbg(dev, "Run _GTF: length or ptr is NULL (0x%llx, 0x%p)\n",
|
||||
(unsigned long long)output.length,
|
||||
output.pointer);
|
||||
rc = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
@ -464,9 +457,8 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf)
|
||||
rc = out_obj->buffer.length / REGS_PER_GTF;
|
||||
if (gtf) {
|
||||
*gtf = (void *)out_obj->buffer.pointer;
|
||||
if (ata_msg_probe(ap))
|
||||
ata_dev_dbg(dev, "%s: returning gtf=%p, gtf_count=%d\n",
|
||||
__func__, *gtf, rc);
|
||||
ata_dev_dbg(dev, "returning gtf=%p, gtf_count=%d\n",
|
||||
*gtf, rc);
|
||||
}
|
||||
return rc;
|
||||
|
||||
@ -650,9 +642,7 @@ static int ata_acpi_run_tf(struct ata_device *dev,
|
||||
struct ata_taskfile *pptf = NULL;
|
||||
struct ata_taskfile tf, ptf, rtf;
|
||||
unsigned int err_mask;
|
||||
const char *level;
|
||||
const char *descr;
|
||||
char msg[60];
|
||||
int rc;
|
||||
|
||||
if ((gtf->tf[0] == 0) && (gtf->tf[1] == 0) && (gtf->tf[2] == 0)
|
||||
@ -666,6 +656,8 @@ static int ata_acpi_run_tf(struct ata_device *dev,
|
||||
pptf = &ptf;
|
||||
}
|
||||
|
||||
descr = ata_get_cmd_name(tf.command);
|
||||
|
||||
if (!ata_acpi_filter_tf(dev, &tf, pptf)) {
|
||||
rtf = tf;
|
||||
err_mask = ata_exec_internal(dev, &rtf, NULL,
|
||||
@ -673,40 +665,42 @@ static int ata_acpi_run_tf(struct ata_device *dev,
|
||||
|
||||
switch (err_mask) {
|
||||
case 0:
|
||||
level = KERN_DEBUG;
|
||||
snprintf(msg, sizeof(msg), "succeeded");
|
||||
ata_dev_dbg(dev,
|
||||
"ACPI cmd %02x/%02x:%02x:%02x:%02x:%02x:%02x"
|
||||
"(%s) succeeded\n",
|
||||
tf.command, tf.feature, tf.nsect, tf.lbal,
|
||||
tf.lbam, tf.lbah, tf.device, descr);
|
||||
rc = 1;
|
||||
break;
|
||||
|
||||
case AC_ERR_DEV:
|
||||
level = KERN_INFO;
|
||||
snprintf(msg, sizeof(msg),
|
||||
"rejected by device (Stat=0x%02x Err=0x%02x)",
|
||||
rtf.command, rtf.feature);
|
||||
ata_dev_info(dev,
|
||||
"ACPI cmd %02x/%02x:%02x:%02x:%02x:%02x:%02x"
|
||||
"(%s) rejected by device (Stat=0x%02x Err=0x%02x)",
|
||||
tf.command, tf.feature, tf.nsect, tf.lbal,
|
||||
tf.lbam, tf.lbah, tf.device, descr,
|
||||
rtf.command, rtf.feature);
|
||||
rc = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
level = KERN_ERR;
|
||||
snprintf(msg, sizeof(msg),
|
||||
"failed (Emask=0x%x Stat=0x%02x Err=0x%02x)",
|
||||
err_mask, rtf.command, rtf.feature);
|
||||
ata_dev_err(dev,
|
||||
"ACPI cmd %02x/%02x:%02x:%02x:%02x:%02x:%02x"
|
||||
"(%s) failed (Emask=0x%x Stat=0x%02x Err=0x%02x)",
|
||||
tf.command, tf.feature, tf.nsect, tf.lbal,
|
||||
tf.lbam, tf.lbah, tf.device, descr,
|
||||
err_mask, rtf.command, rtf.feature);
|
||||
rc = -EIO;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
level = KERN_INFO;
|
||||
snprintf(msg, sizeof(msg), "filtered out");
|
||||
ata_dev_info(dev,
|
||||
"ACPI cmd %02x/%02x:%02x:%02x:%02x:%02x:%02x"
|
||||
"(%s) filtered out\n",
|
||||
tf.command, tf.feature, tf.nsect, tf.lbal,
|
||||
tf.lbam, tf.lbah, tf.device, descr);
|
||||
rc = 0;
|
||||
}
|
||||
descr = ata_get_cmd_descript(tf.command);
|
||||
|
||||
ata_dev_printk(dev, level,
|
||||
"ACPI cmd %02x/%02x:%02x:%02x:%02x:%02x:%02x (%s) %s\n",
|
||||
tf.command, tf.feature, tf.nsect, tf.lbal,
|
||||
tf.lbam, tf.lbah, tf.device,
|
||||
(descr ? descr : "unknown"), msg);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -776,9 +770,8 @@ static int ata_acpi_push_id(struct ata_device *dev)
|
||||
struct acpi_object_list input;
|
||||
union acpi_object in_params[1];
|
||||
|
||||
if (ata_msg_probe(ap))
|
||||
ata_dev_dbg(dev, "%s: ix = %d, port#: %d\n",
|
||||
__func__, dev->devno, ap->port_no);
|
||||
ata_dev_dbg(dev, "%s: ix = %d, port#: %d\n",
|
||||
__func__, dev->devno, ap->port_no);
|
||||
|
||||
/* Give the drive Identify data to the drive via the _SDD method */
|
||||
/* _SDD: set up input parameters */
|
||||
|
@ -764,9 +764,6 @@ int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
|
||||
head = track % dev->heads;
|
||||
sect = (u32)block % dev->sectors + 1;
|
||||
|
||||
DPRINTK("block %u track %u cyl %u head %u sect %u\n",
|
||||
(u32)block, track, cyl, head, sect);
|
||||
|
||||
/* Check whether the converted CHS can fit.
|
||||
Cylinder: 0-65535
|
||||
Head: 0-15
|
||||
@ -1010,32 +1007,21 @@ unsigned int ata_dev_classify(const struct ata_taskfile *tf)
|
||||
* SEMB signature. This is worked around in
|
||||
* ata_dev_read_id().
|
||||
*/
|
||||
if ((tf->lbam == 0) && (tf->lbah == 0)) {
|
||||
DPRINTK("found ATA device by sig\n");
|
||||
if (tf->lbam == 0 && tf->lbah == 0)
|
||||
return ATA_DEV_ATA;
|
||||
}
|
||||
|
||||
if ((tf->lbam == 0x14) && (tf->lbah == 0xeb)) {
|
||||
DPRINTK("found ATAPI device by sig\n");
|
||||
if (tf->lbam == 0x14 && tf->lbah == 0xeb)
|
||||
return ATA_DEV_ATAPI;
|
||||
}
|
||||
|
||||
if ((tf->lbam == 0x69) && (tf->lbah == 0x96)) {
|
||||
DPRINTK("found PMP device by sig\n");
|
||||
if (tf->lbam == 0x69 && tf->lbah == 0x96)
|
||||
return ATA_DEV_PMP;
|
||||
}
|
||||
|
||||
if ((tf->lbam == 0x3c) && (tf->lbah == 0xc3)) {
|
||||
DPRINTK("found SEMB device by sig (could be ATA device)\n");
|
||||
if (tf->lbam == 0x3c && tf->lbah == 0xc3)
|
||||
return ATA_DEV_SEMB;
|
||||
}
|
||||
|
||||
if ((tf->lbam == 0xcd) && (tf->lbah == 0xab)) {
|
||||
DPRINTK("found ZAC device by sig\n");
|
||||
if (tf->lbam == 0xcd && tf->lbah == 0xab)
|
||||
return ATA_DEV_ZAC;
|
||||
}
|
||||
|
||||
DPRINTK("unknown device\n");
|
||||
return ATA_DEV_UNKNOWN;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_dev_classify);
|
||||
@ -1355,6 +1341,7 @@ static int ata_hpa_resize(struct ata_device *dev)
|
||||
|
||||
/**
|
||||
* ata_dump_id - IDENTIFY DEVICE info debugging output
|
||||
* @dev: device from which the information is fetched
|
||||
* @id: IDENTIFY DEVICE page to dump
|
||||
*
|
||||
* Dump selected 16-bit words from the given IDENTIFY DEVICE
|
||||
@ -1364,32 +1351,14 @@ static int ata_hpa_resize(struct ata_device *dev)
|
||||
* caller.
|
||||
*/
|
||||
|
||||
static inline void ata_dump_id(const u16 *id)
|
||||
static inline void ata_dump_id(struct ata_device *dev, const u16 *id)
|
||||
{
|
||||
DPRINTK("49==0x%04x "
|
||||
"53==0x%04x "
|
||||
"63==0x%04x "
|
||||
"64==0x%04x "
|
||||
"75==0x%04x \n",
|
||||
id[49],
|
||||
id[53],
|
||||
id[63],
|
||||
id[64],
|
||||
id[75]);
|
||||
DPRINTK("80==0x%04x "
|
||||
"81==0x%04x "
|
||||
"82==0x%04x "
|
||||
"83==0x%04x "
|
||||
"84==0x%04x \n",
|
||||
id[80],
|
||||
id[81],
|
||||
id[82],
|
||||
id[83],
|
||||
id[84]);
|
||||
DPRINTK("88==0x%04x "
|
||||
"93==0x%04x\n",
|
||||
id[88],
|
||||
id[93]);
|
||||
ata_dev_dbg(dev,
|
||||
"49==0x%04x 53==0x%04x 63==0x%04x 64==0x%04x 75==0x%04x\n"
|
||||
"80==0x%04x 81==0x%04x 82==0x%04x 83==0x%04x 84==0x%04x\n"
|
||||
"88==0x%04x 93==0x%04x\n",
|
||||
id[49], id[53], id[63], id[64], id[75], id[80],
|
||||
id[81], id[82], id[83], id[84], id[88], id[93]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1602,9 +1571,8 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
|
||||
else
|
||||
ata_qc_complete(qc);
|
||||
|
||||
if (ata_msg_warn(ap))
|
||||
ata_dev_warn(dev, "qc timeout (cmd 0x%x)\n",
|
||||
command);
|
||||
ata_dev_warn(dev, "qc timeout (cmd 0x%x)\n",
|
||||
command);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
@ -1754,7 +1722,7 @@ static u32 ata_pio_mask_no_iordy(const struct ata_device *adev)
|
||||
* this function is wrapped or replaced by the driver
|
||||
*/
|
||||
unsigned int ata_do_dev_read_id(struct ata_device *dev,
|
||||
struct ata_taskfile *tf, u16 *id)
|
||||
struct ata_taskfile *tf, __le16 *id)
|
||||
{
|
||||
return ata_exec_internal(dev, tf, NULL, DMA_FROM_DEVICE,
|
||||
id, sizeof(id[0]) * ATA_ID_WORDS, 0);
|
||||
@ -1794,9 +1762,6 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
|
||||
int may_fallback = 1, tried_spinup = 0;
|
||||
int rc;
|
||||
|
||||
if (ata_msg_ctl(ap))
|
||||
ata_dev_dbg(dev, "%s: ENTER\n", __func__);
|
||||
|
||||
retry:
|
||||
ata_tf_init(dev, &tf);
|
||||
|
||||
@ -1830,9 +1795,9 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
|
||||
tf.flags |= ATA_TFLAG_POLLING;
|
||||
|
||||
if (ap->ops->read_id)
|
||||
err_mask = ap->ops->read_id(dev, &tf, id);
|
||||
err_mask = ap->ops->read_id(dev, &tf, (__le16 *)id);
|
||||
else
|
||||
err_mask = ata_do_dev_read_id(dev, &tf, id);
|
||||
err_mask = ata_do_dev_read_id(dev, &tf, (__le16 *)id);
|
||||
|
||||
if (err_mask) {
|
||||
if (err_mask & AC_ERR_NODEV_HINT) {
|
||||
@ -1879,10 +1844,10 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
|
||||
}
|
||||
|
||||
if (dev->horkage & ATA_HORKAGE_DUMP_ID) {
|
||||
ata_dev_dbg(dev, "dumping IDENTIFY data, "
|
||||
ata_dev_info(dev, "dumping IDENTIFY data, "
|
||||
"class=%d may_fallback=%d tried_spinup=%d\n",
|
||||
class, may_fallback, tried_spinup);
|
||||
print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET,
|
||||
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET,
|
||||
16, 2, id, ATA_ID_WORDS * sizeof(*id), true);
|
||||
}
|
||||
|
||||
@ -1966,9 +1931,8 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
if (ata_msg_warn(ap))
|
||||
ata_dev_warn(dev, "failed to IDENTIFY (%s, err_mask=0x%x)\n",
|
||||
reason, err_mask);
|
||||
ata_dev_warn(dev, "failed to IDENTIFY (%s, err_mask=0x%x)\n",
|
||||
reason, err_mask);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -1996,7 +1960,7 @@ unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
|
||||
unsigned int err_mask;
|
||||
bool dma = false;
|
||||
|
||||
DPRINTK("read log page - log 0x%x, page 0x%x\n", log, page);
|
||||
ata_dev_dbg(dev, "read log page - log 0x%x, page 0x%x\n", log, page);
|
||||
|
||||
/*
|
||||
* Return error without actually issuing the command on controllers
|
||||
@ -2390,7 +2354,6 @@ static void ata_dev_config_trusted(struct ata_device *dev)
|
||||
|
||||
static int ata_dev_config_lba(struct ata_device *dev)
|
||||
{
|
||||
struct ata_port *ap = dev->link->ap;
|
||||
const u16 *id = dev->id;
|
||||
const char *lba_desc;
|
||||
char ncq_desc[24];
|
||||
@ -2412,7 +2375,7 @@ static int ata_dev_config_lba(struct ata_device *dev)
|
||||
ret = ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc));
|
||||
|
||||
/* print device info to dmesg */
|
||||
if (ata_msg_drv(ap) && ata_dev_print_info(dev))
|
||||
if (ata_dev_print_info(dev))
|
||||
ata_dev_info(dev,
|
||||
"%llu sectors, multi %u: %s %s\n",
|
||||
(unsigned long long)dev->n_sectors,
|
||||
@ -2423,7 +2386,6 @@ static int ata_dev_config_lba(struct ata_device *dev)
|
||||
|
||||
static void ata_dev_config_chs(struct ata_device *dev)
|
||||
{
|
||||
struct ata_port *ap = dev->link->ap;
|
||||
const u16 *id = dev->id;
|
||||
|
||||
if (ata_id_current_chs_valid(id)) {
|
||||
@ -2439,7 +2401,7 @@ static void ata_dev_config_chs(struct ata_device *dev)
|
||||
}
|
||||
|
||||
/* print device info to dmesg */
|
||||
if (ata_msg_drv(ap) && ata_dev_print_info(dev))
|
||||
if (ata_dev_print_info(dev))
|
||||
ata_dev_info(dev,
|
||||
"%llu sectors, multi %u, CHS %u/%u/%u\n",
|
||||
(unsigned long long)dev->n_sectors,
|
||||
@ -2566,14 +2528,11 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
char modelbuf[ATA_ID_PROD_LEN+1];
|
||||
int rc;
|
||||
|
||||
if (!ata_dev_enabled(dev) && ata_msg_info(ap)) {
|
||||
ata_dev_info(dev, "%s: ENTER/EXIT -- nodev\n", __func__);
|
||||
if (!ata_dev_enabled(dev)) {
|
||||
ata_dev_dbg(dev, "no device\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ata_msg_probe(ap))
|
||||
ata_dev_dbg(dev, "%s: ENTER\n", __func__);
|
||||
|
||||
/* set horkage */
|
||||
dev->horkage |= ata_dev_blacklisted(dev);
|
||||
ata_force_horkage(dev);
|
||||
@ -2621,13 +2580,12 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
return rc;
|
||||
|
||||
/* print device capabilities */
|
||||
if (ata_msg_probe(ap))
|
||||
ata_dev_dbg(dev,
|
||||
"%s: cfg 49:%04x 82:%04x 83:%04x 84:%04x "
|
||||
"85:%04x 86:%04x 87:%04x 88:%04x\n",
|
||||
__func__,
|
||||
id[49], id[82], id[83], id[84],
|
||||
id[85], id[86], id[87], id[88]);
|
||||
ata_dev_dbg(dev,
|
||||
"%s: cfg 49:%04x 82:%04x 83:%04x 84:%04x "
|
||||
"85:%04x 86:%04x 87:%04x 88:%04x\n",
|
||||
__func__,
|
||||
id[49], id[82], id[83], id[84],
|
||||
id[85], id[86], id[87], id[88]);
|
||||
|
||||
/* initialize to-be-configured parameters */
|
||||
dev->flags &= ~ATA_DFLAG_CFG_MASK;
|
||||
@ -2646,8 +2604,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
/* find max transfer mode; for printk only */
|
||||
xfer_mask = ata_id_xfermask(id);
|
||||
|
||||
if (ata_msg_probe(ap))
|
||||
ata_dump_id(id);
|
||||
ata_dump_id(dev, id);
|
||||
|
||||
/* SCSI only uses 4-char revisions, dump full 8 chars from ATA */
|
||||
ata_id_c_string(dev->id, fwrevbuf, ATA_ID_FW_REV,
|
||||
@ -2685,7 +2642,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
}
|
||||
|
||||
/* print device info to dmesg */
|
||||
if (ata_msg_drv(ap) && print_info)
|
||||
if (print_info)
|
||||
ata_dev_info(dev, "%s: %s, %s, max %s\n",
|
||||
revbuf, modelbuf, fwrevbuf,
|
||||
ata_mode_string(xfer_mask));
|
||||
@ -2705,7 +2662,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
ata_dev_config_cpr(dev);
|
||||
dev->cdb_len = 32;
|
||||
|
||||
if (ata_msg_drv(ap) && print_info)
|
||||
if (print_info)
|
||||
ata_dev_print_features(dev);
|
||||
}
|
||||
|
||||
@ -2718,8 +2675,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
|
||||
rc = atapi_cdb_len(id);
|
||||
if ((rc < 12) || (rc > ATAPI_CDB_LEN)) {
|
||||
if (ata_msg_warn(ap))
|
||||
ata_dev_warn(dev, "unsupported CDB len\n");
|
||||
ata_dev_warn(dev, "unsupported CDB len %d\n", rc);
|
||||
rc = -EINVAL;
|
||||
goto err_out_nosup;
|
||||
}
|
||||
@ -2763,7 +2719,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
}
|
||||
|
||||
/* print device info to dmesg */
|
||||
if (ata_msg_drv(ap) && print_info)
|
||||
if (print_info)
|
||||
ata_dev_info(dev,
|
||||
"ATAPI: %s, %s, max %s%s%s%s\n",
|
||||
modelbuf, fwrevbuf,
|
||||
@ -2780,7 +2736,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
/* Limit PATA drive on SATA cable bridge transfers to udma5,
|
||||
200 sectors */
|
||||
if (ata_dev_knobble(dev)) {
|
||||
if (ata_msg_drv(ap) && print_info)
|
||||
if (print_info)
|
||||
ata_dev_info(dev, "applying bridge limits\n");
|
||||
dev->udma_mask &= ATA_UDMA5;
|
||||
dev->max_sectors = ATA_MAX_SECTORS;
|
||||
@ -2829,8 +2785,6 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
return 0;
|
||||
|
||||
err_out_nosup:
|
||||
if (ata_msg_probe(ap))
|
||||
ata_dev_dbg(dev, "%s: EXIT, err\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -3373,8 +3327,8 @@ static int ata_dev_set_mode(struct ata_device *dev)
|
||||
dev_err_whine = " (device error ignored)";
|
||||
}
|
||||
|
||||
DPRINTK("xfer_shift=%u, xfer_mode=0x%x\n",
|
||||
dev->xfer_shift, (int)dev->xfer_mode);
|
||||
ata_dev_dbg(dev, "xfer_shift=%u, xfer_mode=0x%x\n",
|
||||
dev->xfer_shift, (int)dev->xfer_mode);
|
||||
|
||||
if (!(ehc->i.flags & ATA_EHI_QUIET) ||
|
||||
ehc->i.flags & ATA_EHI_DID_HARDRESET)
|
||||
@ -3688,16 +3642,12 @@ void ata_std_postreset(struct ata_link *link, unsigned int *classes)
|
||||
{
|
||||
u32 serror;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
/* reset complete, clear SError */
|
||||
if (!sata_scr_read(link, SCR_ERROR, &serror))
|
||||
sata_scr_write(link, SCR_ERROR, serror);
|
||||
|
||||
/* print link status */
|
||||
sata_print_link_status(link);
|
||||
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_std_postreset);
|
||||
|
||||
@ -4324,7 +4274,7 @@ static unsigned int ata_dev_set_xfermode(struct ata_device *dev)
|
||||
unsigned int err_mask;
|
||||
|
||||
/* set up set-features taskfile */
|
||||
DPRINTK("set features - xfer mode\n");
|
||||
ata_dev_dbg(dev, "set features - xfer mode\n");
|
||||
|
||||
/* Some controllers and ATAPI devices show flaky interrupt
|
||||
* behavior after setting xfer mode. Use polling instead.
|
||||
@ -4346,7 +4296,6 @@ static unsigned int ata_dev_set_xfermode(struct ata_device *dev)
|
||||
/* On some disks, this command causes spin-up, so we need longer timeout */
|
||||
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 15000);
|
||||
|
||||
DPRINTK("EXIT, err_mask=%x\n", err_mask);
|
||||
return err_mask;
|
||||
}
|
||||
|
||||
@ -4372,7 +4321,7 @@ unsigned int ata_dev_set_feature(struct ata_device *dev, u8 enable, u8 feature)
|
||||
unsigned long timeout = 0;
|
||||
|
||||
/* set up set-features taskfile */
|
||||
DPRINTK("set features - SATA features\n");
|
||||
ata_dev_dbg(dev, "set features - SATA features\n");
|
||||
|
||||
ata_tf_init(dev, &tf);
|
||||
tf.command = ATA_CMD_SET_FEATURES;
|
||||
@ -4386,7 +4335,6 @@ unsigned int ata_dev_set_feature(struct ata_device *dev, u8 enable, u8 feature)
|
||||
ata_probe_timeout * 1000 : SETFEATURES_SPINUP_TIMEOUT;
|
||||
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, timeout);
|
||||
|
||||
DPRINTK("EXIT, err_mask=%x\n", err_mask);
|
||||
return err_mask;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_dev_set_feature);
|
||||
@ -4414,7 +4362,7 @@ static unsigned int ata_dev_init_params(struct ata_device *dev,
|
||||
return AC_ERR_INVALID;
|
||||
|
||||
/* set up init dev params taskfile */
|
||||
DPRINTK("init dev params \n");
|
||||
ata_dev_dbg(dev, "init dev params \n");
|
||||
|
||||
ata_tf_init(dev, &tf);
|
||||
tf.command = ATA_CMD_INIT_DEV_PARAMS;
|
||||
@ -4430,7 +4378,6 @@ static unsigned int ata_dev_init_params(struct ata_device *dev,
|
||||
if (err_mask == AC_ERR_DEV && (tf.feature & ATA_ABORTED))
|
||||
err_mask = 0;
|
||||
|
||||
DPRINTK("EXIT, err_mask=%x\n", err_mask);
|
||||
return err_mask;
|
||||
}
|
||||
|
||||
@ -4542,8 +4489,6 @@ static void ata_sg_clean(struct ata_queued_cmd *qc)
|
||||
|
||||
WARN_ON_ONCE(sg == NULL);
|
||||
|
||||
VPRINTK("unmapping %u sg elements\n", qc->n_elem);
|
||||
|
||||
if (qc->n_elem)
|
||||
dma_unmap_sg(ap->dev, sg, qc->orig_n_elem, dir);
|
||||
|
||||
@ -4569,13 +4514,10 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
|
||||
struct ata_port *ap = qc->ap;
|
||||
unsigned int n_elem;
|
||||
|
||||
VPRINTK("ENTER, ata%u\n", ap->print_id);
|
||||
|
||||
n_elem = dma_map_sg(ap->dev, qc->sg, qc->n_elem, qc->dma_dir);
|
||||
if (n_elem < 1)
|
||||
return -1;
|
||||
|
||||
VPRINTK("%d sg elements mapped\n", n_elem);
|
||||
qc->orig_n_elem = qc->n_elem;
|
||||
qc->n_elem = n_elem;
|
||||
qc->flags |= ATA_QCFLAG_DMAMAP;
|
||||
@ -4930,6 +4872,7 @@ void ata_qc_issue(struct ata_queued_cmd *qc)
|
||||
return;
|
||||
}
|
||||
|
||||
trace_ata_qc_prep(qc);
|
||||
qc->err_mask |= ap->ops->qc_prep(qc);
|
||||
if (unlikely(qc->err_mask))
|
||||
goto err;
|
||||
@ -5375,8 +5318,6 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
|
||||
{
|
||||
struct ata_port *ap;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
ap = kzalloc(sizeof(*ap), GFP_KERNEL);
|
||||
if (!ap)
|
||||
return NULL;
|
||||
@ -5388,15 +5329,6 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
|
||||
ap->host = host;
|
||||
ap->dev = host->dev;
|
||||
|
||||
#if defined(ATA_VERBOSE_DEBUG)
|
||||
/* turn on all debugging levels */
|
||||
ap->msg_enable = 0x00FF;
|
||||
#elif defined(ATA_DEBUG)
|
||||
ap->msg_enable = ATA_MSG_DRV | ATA_MSG_INFO | ATA_MSG_CTL | ATA_MSG_WARN | ATA_MSG_ERR;
|
||||
#else
|
||||
ap->msg_enable = ATA_MSG_DRV | ATA_MSG_ERR | ATA_MSG_WARN;
|
||||
#endif
|
||||
|
||||
mutex_init(&ap->scsi_scan_mutex);
|
||||
INIT_DELAYED_WORK(&ap->hotplug_task, ata_scsi_hotplug);
|
||||
INIT_WORK(&ap->scsi_rescan_task, ata_scsi_dev_rescan);
|
||||
@ -5493,8 +5425,6 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
|
||||
int i;
|
||||
void *dr;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
/* alloc a container for our list of ATA ports (buses) */
|
||||
sz = sizeof(struct ata_host) + (max_ports + 1) * sizeof(void *);
|
||||
host = kzalloc(sz, GFP_KERNEL);
|
||||
@ -5784,9 +5714,7 @@ int ata_port_probe(struct ata_port *ap)
|
||||
__ata_port_probe(ap);
|
||||
ata_port_wait_eh(ap);
|
||||
} else {
|
||||
DPRINTK("ata%u: bus probe begin\n", ap->print_id);
|
||||
rc = ata_bus_probe(ap);
|
||||
DPRINTK("ata%u: bus probe end\n", ap->print_id);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
@ -6553,69 +6481,14 @@ const struct ata_port_info ata_dummy_port_info = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ata_dummy_port_info);
|
||||
|
||||
/*
|
||||
* Utility print functions
|
||||
*/
|
||||
void ata_port_printk(const struct ata_port *ap, const char *level,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
printk("%sata%u: %pV", level, ap->print_id, &vaf);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
EXPORT_SYMBOL(ata_port_printk);
|
||||
|
||||
void ata_link_printk(const struct ata_link *link, const char *level,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
if (sata_pmp_attached(link->ap) || link->ap->slave_link)
|
||||
printk("%sata%u.%02u: %pV",
|
||||
level, link->ap->print_id, link->pmp, &vaf);
|
||||
else
|
||||
printk("%sata%u: %pV",
|
||||
level, link->ap->print_id, &vaf);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
EXPORT_SYMBOL(ata_link_printk);
|
||||
|
||||
void ata_dev_printk(const struct ata_device *dev, const char *level,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
printk("%sata%u.%02u: %pV",
|
||||
level, dev->link->ap->print_id, dev->link->pmp + dev->devno,
|
||||
&vaf);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
EXPORT_SYMBOL(ata_dev_printk);
|
||||
|
||||
void ata_print_version(const struct device *dev, const char *version)
|
||||
{
|
||||
dev_printk(KERN_DEBUG, dev, "version %s\n", version);
|
||||
}
|
||||
EXPORT_SYMBOL(ata_print_version);
|
||||
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(ata_tf_load);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(ata_exec_command);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(ata_bmdma_setup);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(ata_bmdma_start);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(ata_bmdma_status);
|
||||
|
@ -533,8 +533,6 @@ void ata_scsi_error(struct Scsi_Host *host)
|
||||
unsigned long flags;
|
||||
LIST_HEAD(eh_work_q);
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
spin_lock_irqsave(host->host_lock, flags);
|
||||
list_splice_init(&host->eh_cmd_q, &eh_work_q);
|
||||
spin_unlock_irqrestore(host->host_lock, flags);
|
||||
@ -548,7 +546,6 @@ void ata_scsi_error(struct Scsi_Host *host)
|
||||
/* finish or retry handled scmd's and clean up */
|
||||
WARN_ON(!list_empty(&eh_work_q));
|
||||
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -940,7 +937,7 @@ void ata_std_sched_eh(struct ata_port *ap)
|
||||
ata_eh_set_pending(ap, 1);
|
||||
scsi_schedule_eh(ap->scsi_host);
|
||||
|
||||
DPRINTK("port EH scheduled\n");
|
||||
trace_ata_std_sched_eh(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_std_sched_eh);
|
||||
|
||||
@ -1070,7 +1067,7 @@ static void __ata_port_freeze(struct ata_port *ap)
|
||||
|
||||
ap->pflags |= ATA_PFLAG_FROZEN;
|
||||
|
||||
DPRINTK("ata%u port frozen\n", ap->print_id);
|
||||
trace_ata_port_freeze(ap);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1147,7 +1144,7 @@ void ata_eh_thaw_port(struct ata_port *ap)
|
||||
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
|
||||
DPRINTK("ata%u port thawed\n", ap->print_id);
|
||||
trace_ata_port_thaw(ap);
|
||||
}
|
||||
|
||||
static void ata_eh_scsidone(struct scsi_cmnd *scmd)
|
||||
@ -1217,8 +1214,7 @@ void ata_dev_disable(struct ata_device *dev)
|
||||
if (!ata_dev_enabled(dev))
|
||||
return;
|
||||
|
||||
if (ata_msg_drv(dev->link->ap))
|
||||
ata_dev_warn(dev, "disabled\n");
|
||||
ata_dev_warn(dev, "disable device\n");
|
||||
ata_acpi_on_disable(dev);
|
||||
ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 | ATA_DNXFER_QUIET);
|
||||
dev->class++;
|
||||
@ -1287,6 +1283,8 @@ void ata_eh_about_to_do(struct ata_link *link, struct ata_device *dev,
|
||||
struct ata_eh_context *ehc = &link->eh_context;
|
||||
unsigned long flags;
|
||||
|
||||
trace_ata_eh_about_to_do(link, dev ? dev->devno : 0, action);
|
||||
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
|
||||
ata_eh_clear_action(link, dev, ehi, action);
|
||||
@ -1317,6 +1315,8 @@ void ata_eh_done(struct ata_link *link, struct ata_device *dev,
|
||||
{
|
||||
struct ata_eh_context *ehc = &link->eh_context;
|
||||
|
||||
trace_ata_eh_done(link, dev ? dev->devno : 0, action);
|
||||
|
||||
ata_eh_clear_action(link, dev, &ehc->i, action);
|
||||
}
|
||||
|
||||
@ -1421,8 +1421,6 @@ static void ata_eh_request_sense(struct ata_queued_cmd *qc,
|
||||
return;
|
||||
}
|
||||
|
||||
DPRINTK("ATA request sense\n");
|
||||
|
||||
ata_tf_init(dev, &tf);
|
||||
tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
|
||||
tf.flags |= ATA_TFLAG_LBA | ATA_TFLAG_LBA48;
|
||||
@ -1463,8 +1461,6 @@ unsigned int atapi_eh_request_sense(struct ata_device *dev,
|
||||
struct ata_port *ap = dev->link->ap;
|
||||
struct ata_taskfile tf;
|
||||
|
||||
DPRINTK("ATAPI request sense\n");
|
||||
|
||||
memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE);
|
||||
|
||||
/* initialize sense_buf with the error register,
|
||||
@ -1928,8 +1924,6 @@ static void ata_eh_link_autopsy(struct ata_link *link)
|
||||
u32 serror;
|
||||
int rc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
if (ehc->i.flags & ATA_EHI_NO_AUTOPSY)
|
||||
return;
|
||||
|
||||
@ -2036,7 +2030,6 @@ static void ata_eh_link_autopsy(struct ata_link *link)
|
||||
ehc->i.action |= ata_eh_speed_down(dev, eflags, all_err_mask);
|
||||
trace_ata_eh_link_autopsy(dev, ehc->i.action, all_err_mask);
|
||||
}
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2086,16 +2079,15 @@ void ata_eh_autopsy(struct ata_port *ap)
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_get_cmd_descript - get description for ATA command
|
||||
* @command: ATA command code to get description for
|
||||
* ata_get_cmd_name - get name for ATA command
|
||||
* @command: ATA command code to get name for
|
||||
*
|
||||
* Return a textual description of the given command, or NULL if the
|
||||
* command is not known.
|
||||
* Return a textual name of the given command or "unknown"
|
||||
*
|
||||
* LOCKING:
|
||||
* None
|
||||
*/
|
||||
const char *ata_get_cmd_descript(u8 command)
|
||||
const char *ata_get_cmd_name(u8 command)
|
||||
{
|
||||
#ifdef CONFIG_ATA_VERBOSE_ERROR
|
||||
static const struct
|
||||
@ -2203,9 +2195,9 @@ const char *ata_get_cmd_descript(u8 command)
|
||||
return cmd_descr[i].text;
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
return "unknown";
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_get_cmd_descript);
|
||||
EXPORT_SYMBOL_GPL(ata_get_cmd_name);
|
||||
|
||||
/**
|
||||
* ata_eh_link_report - report error handling to user
|
||||
@ -2354,12 +2346,9 @@ static void ata_eh_link_report(struct ata_link *link)
|
||||
}
|
||||
__scsi_format_command(cdb_buf, sizeof(cdb_buf),
|
||||
cdb, cdb_len);
|
||||
} else {
|
||||
const char *descr = ata_get_cmd_descript(cmd->command);
|
||||
if (descr)
|
||||
ata_dev_err(qc->dev, "failed command: %s\n",
|
||||
descr);
|
||||
}
|
||||
} else
|
||||
ata_dev_err(qc->dev, "failed command: %s\n",
|
||||
ata_get_cmd_name(cmd->command));
|
||||
|
||||
ata_dev_err(qc->dev,
|
||||
"cmd %02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x "
|
||||
@ -2596,12 +2585,19 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||
|
||||
/* mark that this EH session started with reset */
|
||||
ehc->last_reset = jiffies;
|
||||
if (reset == hardreset)
|
||||
if (reset == hardreset) {
|
||||
ehc->i.flags |= ATA_EHI_DID_HARDRESET;
|
||||
else
|
||||
trace_ata_link_hardreset_begin(link, classes, deadline);
|
||||
} else {
|
||||
ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
|
||||
trace_ata_link_softreset_begin(link, classes, deadline);
|
||||
}
|
||||
|
||||
rc = ata_do_reset(link, reset, classes, deadline, true);
|
||||
if (reset == hardreset)
|
||||
trace_ata_link_hardreset_end(link, classes, rc);
|
||||
else
|
||||
trace_ata_link_softreset_end(link, classes, rc);
|
||||
if (rc && rc != -EAGAIN) {
|
||||
failed_link = link;
|
||||
goto fail;
|
||||
@ -2615,8 +2611,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||
ata_link_info(slave, "hard resetting link\n");
|
||||
|
||||
ata_eh_about_to_do(slave, NULL, ATA_EH_RESET);
|
||||
trace_ata_slave_hardreset_begin(slave, classes,
|
||||
deadline);
|
||||
tmp = ata_do_reset(slave, reset, classes, deadline,
|
||||
false);
|
||||
trace_ata_slave_hardreset_end(slave, classes, tmp);
|
||||
switch (tmp) {
|
||||
case -EAGAIN:
|
||||
rc = -EAGAIN;
|
||||
@ -2644,7 +2643,9 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||
}
|
||||
|
||||
ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
|
||||
trace_ata_link_softreset_begin(link, classes, deadline);
|
||||
rc = ata_do_reset(link, reset, classes, deadline, true);
|
||||
trace_ata_link_softreset_end(link, classes, rc);
|
||||
if (rc) {
|
||||
failed_link = link;
|
||||
goto fail;
|
||||
@ -2698,8 +2699,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||
*/
|
||||
if (postreset) {
|
||||
postreset(link, classes);
|
||||
if (slave)
|
||||
trace_ata_link_postreset(link, classes, rc);
|
||||
if (slave) {
|
||||
postreset(slave, classes);
|
||||
trace_ata_slave_postreset(slave, classes, rc);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2921,8 +2925,6 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
|
||||
unsigned long flags;
|
||||
int rc = 0;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
/* For PATA drive side cable detection to work, IDENTIFY must
|
||||
* be done backwards such that PDIAG- is released by the slave
|
||||
* device before the master device is identified.
|
||||
@ -3036,7 +3038,6 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
|
||||
|
||||
err:
|
||||
*r_failed_dev = dev;
|
||||
DPRINTK("EXIT rc=%d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -3551,8 +3552,6 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
|
||||
int rc, nr_fails;
|
||||
unsigned long flags, deadline;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
/* prep for recovery */
|
||||
ata_for_each_link(link, ap, EDGE) {
|
||||
struct ata_eh_context *ehc = &link->eh_context;
|
||||
@ -3760,7 +3759,6 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
|
||||
if (rc && r_failed_link)
|
||||
*r_failed_link = link;
|
||||
|
||||
DPRINTK("EXIT, rc=%d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -652,8 +652,6 @@ static int sata_pmp_revalidate(struct ata_device *dev, unsigned int new_class)
|
||||
u32 *gscr = (void *)ap->sector_buf;
|
||||
int rc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
ata_eh_about_to_do(link, NULL, ATA_EH_REVALIDATE);
|
||||
|
||||
if (!ata_dev_enabled(dev)) {
|
||||
@ -686,12 +684,10 @@ static int sata_pmp_revalidate(struct ata_device *dev, unsigned int new_class)
|
||||
|
||||
ata_eh_done(link, NULL, ATA_EH_REVALIDATE);
|
||||
|
||||
DPRINTK("EXIT, rc=0\n");
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
ata_dev_err(dev, "PMP revalidation failed (errno=%d)\n", rc);
|
||||
DPRINTK("EXIT, rc=%d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -759,8 +755,6 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
|
||||
int detach = 0, rc = 0;
|
||||
int reval_failed = 0;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
if (dev->flags & ATA_DFLAG_DETACH) {
|
||||
detach = 1;
|
||||
rc = -ENODEV;
|
||||
@ -828,7 +822,6 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
|
||||
/* okay, PMP resurrected */
|
||||
ehc->i.flags = 0;
|
||||
|
||||
DPRINTK("EXIT, rc=0\n");
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
@ -838,7 +831,6 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
|
||||
else
|
||||
ata_dev_disable(dev);
|
||||
|
||||
DPRINTK("EXIT, rc=%d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -317,7 +317,7 @@ int sata_link_resume(struct ata_link *link, const unsigned long *params,
|
||||
* immediately after resuming. Delay 200ms before
|
||||
* debouncing.
|
||||
*/
|
||||
if (!(link->flags & ATA_LFLAG_NO_DB_DELAY))
|
||||
if (!(link->flags & ATA_LFLAG_NO_DEBOUNCE_DELAY))
|
||||
ata_msleep(link->ap, 200);
|
||||
|
||||
/* is SControl restored correctly? */
|
||||
@ -533,8 +533,6 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
|
||||
u32 scontrol;
|
||||
int rc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
if (online)
|
||||
*online = false;
|
||||
|
||||
@ -610,7 +608,6 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
|
||||
*online = false;
|
||||
ata_link_err(link, "COMRESET failed (errno=%d)\n", rc);
|
||||
}
|
||||
DPRINTK("EXIT, rc=%d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sata_link_hardreset);
|
||||
@ -876,7 +873,7 @@ static ssize_t ata_ncq_prio_enable_show(struct device *device,
|
||||
ncq_prio_enable = dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLE;
|
||||
spin_unlock_irq(ap->lock);
|
||||
|
||||
return rc ? rc : snprintf(buf, 20, "%u\n", ncq_prio_enable);
|
||||
return rc ? rc : sysfs_emit(buf, "%u\n", ncq_prio_enable);
|
||||
}
|
||||
|
||||
static ssize_t ata_ncq_prio_enable_store(struct device *device,
|
||||
@ -972,7 +969,7 @@ ata_scsi_em_message_type_show(struct device *dev, struct device_attribute *attr,
|
||||
struct Scsi_Host *shost = class_to_shost(dev);
|
||||
struct ata_port *ap = ata_shost_to_port(shost);
|
||||
|
||||
return snprintf(buf, 23, "%d\n", ap->em_message_type);
|
||||
return sysfs_emit(buf, "%d\n", ap->em_message_type);
|
||||
}
|
||||
DEVICE_ATTR(em_message_type, S_IRUGO,
|
||||
ata_scsi_em_message_type_show, NULL);
|
||||
@ -1261,8 +1258,6 @@ int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
ata_scsi_dump_cdb(ap, cmd);
|
||||
|
||||
if (likely(ata_dev_enabled(ap->link.device)))
|
||||
rc = __ata_scsi_queuecmd(cmd, ap->link.device);
|
||||
else {
|
||||
|
@ -121,7 +121,7 @@ static ssize_t ata_scsi_park_show(struct device *device,
|
||||
unlock:
|
||||
spin_unlock_irq(ap->lock);
|
||||
|
||||
return rc ? rc : snprintf(buf, 20, "%u\n", msecs);
|
||||
return rc ? rc : sysfs_emit(buf, "%u\n", msecs);
|
||||
}
|
||||
|
||||
static ssize_t ata_scsi_park_store(struct device *device,
|
||||
@ -668,7 +668,7 @@ static void ata_qc_set_pc_nbytes(struct ata_queued_cmd *qc)
|
||||
|
||||
/**
|
||||
* ata_dump_status - user friendly display of error info
|
||||
* @id: id of the port in question
|
||||
* @ap: the port in question
|
||||
* @tf: ptr to filled out taskfile
|
||||
*
|
||||
* Decode and dump the ATA error/status registers for the user so
|
||||
@ -678,37 +678,32 @@ static void ata_qc_set_pc_nbytes(struct ata_queued_cmd *qc)
|
||||
* LOCKING:
|
||||
* inherited from caller
|
||||
*/
|
||||
static void ata_dump_status(unsigned id, struct ata_taskfile *tf)
|
||||
static void ata_dump_status(struct ata_port *ap, struct ata_taskfile *tf)
|
||||
{
|
||||
u8 stat = tf->command, err = tf->feature;
|
||||
|
||||
pr_warn("ata%u: status=0x%02x { ", id, stat);
|
||||
if (stat & ATA_BUSY) {
|
||||
pr_cont("Busy }\n"); /* Data is not valid in this case */
|
||||
ata_port_warn(ap, "status=0x%02x {Busy} ", stat);
|
||||
} else {
|
||||
if (stat & ATA_DRDY) pr_cont("DriveReady ");
|
||||
if (stat & ATA_DF) pr_cont("DeviceFault ");
|
||||
if (stat & ATA_DSC) pr_cont("SeekComplete ");
|
||||
if (stat & ATA_DRQ) pr_cont("DataRequest ");
|
||||
if (stat & ATA_CORR) pr_cont("CorrectedError ");
|
||||
if (stat & ATA_SENSE) pr_cont("Sense ");
|
||||
if (stat & ATA_ERR) pr_cont("Error ");
|
||||
pr_cont("}\n");
|
||||
|
||||
if (err) {
|
||||
pr_warn("ata%u: error=0x%02x { ", id, err);
|
||||
if (err & ATA_ABORTED) pr_cont("DriveStatusError ");
|
||||
if (err & ATA_ICRC) {
|
||||
if (err & ATA_ABORTED)
|
||||
pr_cont("BadCRC ");
|
||||
else pr_cont("Sector ");
|
||||
}
|
||||
if (err & ATA_UNC) pr_cont("UncorrectableError ");
|
||||
if (err & ATA_IDNF) pr_cont("SectorIdNotFound ");
|
||||
if (err & ATA_TRK0NF) pr_cont("TrackZeroNotFound ");
|
||||
if (err & ATA_AMNF) pr_cont("AddrMarkNotFound ");
|
||||
pr_cont("}\n");
|
||||
}
|
||||
ata_port_warn(ap, "status=0x%02x { %s%s%s%s%s%s%s} ", stat,
|
||||
stat & ATA_DRDY ? "DriveReady " : "",
|
||||
stat & ATA_DF ? "DeviceFault " : "",
|
||||
stat & ATA_DSC ? "SeekComplete " : "",
|
||||
stat & ATA_DRQ ? "DataRequest " : "",
|
||||
stat & ATA_CORR ? "CorrectedError " : "",
|
||||
stat & ATA_SENSE ? "Sense " : "",
|
||||
stat & ATA_ERR ? "Error " : "");
|
||||
if (err)
|
||||
ata_port_warn(ap, "error=0x%02x {%s%s%s%s%s%s", err,
|
||||
err & ATA_ABORTED ?
|
||||
"DriveStatusError " : "",
|
||||
err & ATA_ICRC ?
|
||||
(err & ATA_ABORTED ?
|
||||
"BadCRC " : "Sector ") : "",
|
||||
err & ATA_UNC ? "UncorrectableError " : "",
|
||||
err & ATA_IDNF ? "SectorIdNotFound " : "",
|
||||
err & ATA_TRK0NF ? "TrackZeroNotFound " : "",
|
||||
err & ATA_AMNF ? "AddrMarkNotFound " : "");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1299,8 +1294,6 @@ static void scsi_6_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
|
||||
u64 lba = 0;
|
||||
u32 len;
|
||||
|
||||
VPRINTK("six-byte command\n");
|
||||
|
||||
lba |= ((u64)(cdb[1] & 0x1f)) << 16;
|
||||
lba |= ((u64)cdb[2]) << 8;
|
||||
lba |= ((u64)cdb[3]);
|
||||
@ -1326,8 +1319,6 @@ static void scsi_10_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
|
||||
u64 lba = 0;
|
||||
u32 len = 0;
|
||||
|
||||
VPRINTK("ten-byte command\n");
|
||||
|
||||
lba |= ((u64)cdb[2]) << 24;
|
||||
lba |= ((u64)cdb[3]) << 16;
|
||||
lba |= ((u64)cdb[4]) << 8;
|
||||
@ -1355,8 +1346,6 @@ static void scsi_16_lba_len(const u8 *cdb, u64 *plba, u32 *plen)
|
||||
u64 lba = 0;
|
||||
u32 len = 0;
|
||||
|
||||
VPRINTK("sixteen-byte command\n");
|
||||
|
||||
lba |= ((u64)cdb[2]) << 56;
|
||||
lba |= ((u64)cdb[3]) << 48;
|
||||
lba |= ((u64)cdb[4]) << 40;
|
||||
@ -1469,9 +1458,6 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc)
|
||||
head = track % dev->heads;
|
||||
sect = (u32)block % dev->sectors + 1;
|
||||
|
||||
DPRINTK("block %u track %u cyl %u head %u sect %u\n",
|
||||
(u32)block, track, cyl, head, sect);
|
||||
|
||||
/* Check whether the converted CHS can fit.
|
||||
Cylinder: 0-65535
|
||||
Head: 0-15
|
||||
@ -1594,7 +1580,6 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
|
||||
goto invalid_fld;
|
||||
break;
|
||||
default:
|
||||
DPRINTK("no-byte command\n");
|
||||
fp = 0;
|
||||
goto invalid_fld;
|
||||
}
|
||||
@ -1672,7 +1657,7 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
|
||||
cmd->result = SAM_STAT_GOOD;
|
||||
|
||||
if (need_sense && !ap->ops->error_handler)
|
||||
ata_dump_status(ap->print_id, &qc->result_tf);
|
||||
ata_dump_status(ap, &qc->result_tf);
|
||||
|
||||
ata_qc_done(qc);
|
||||
}
|
||||
@ -1710,8 +1695,6 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
|
||||
struct ata_queued_cmd *qc;
|
||||
int rc;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
qc = ata_scsi_qc_new(dev, cmd);
|
||||
if (!qc)
|
||||
goto err_mem;
|
||||
@ -1742,13 +1725,11 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
|
||||
/* select device, send command to hardware */
|
||||
ata_qc_issue(qc);
|
||||
|
||||
VPRINTK("EXIT\n");
|
||||
return 0;
|
||||
|
||||
early_finish:
|
||||
ata_qc_free(qc);
|
||||
scsi_done(cmd);
|
||||
DPRINTK("EXIT - early finish (good or error)\n");
|
||||
return 0;
|
||||
|
||||
err_did:
|
||||
@ -1756,12 +1737,10 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
|
||||
cmd->result = (DID_ERROR << 16);
|
||||
scsi_done(cmd);
|
||||
err_mem:
|
||||
DPRINTK("EXIT - internal\n");
|
||||
return 0;
|
||||
|
||||
defer:
|
||||
ata_qc_free(qc);
|
||||
DPRINTK("EXIT - defer\n");
|
||||
if (rc == ATA_DEFER_LINK)
|
||||
return SCSI_MLQUEUE_DEVICE_BUSY;
|
||||
else
|
||||
@ -1858,8 +1837,6 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)
|
||||
2
|
||||
};
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
/* set scsi removable (RMB) bit per ata bit, or if the
|
||||
* AHCI port says it's external (Hotplug-capable, eSATA).
|
||||
*/
|
||||
@ -2294,8 +2271,6 @@ static unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf)
|
||||
u8 dpofua, bp = 0xff;
|
||||
u16 fp;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
six_byte = (scsicmd[0] == MODE_SENSE);
|
||||
ebd = !(scsicmd[1] & 0x8); /* dbd bit inverted == edb */
|
||||
/*
|
||||
@ -2413,8 +2388,6 @@ static unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf)
|
||||
log2_per_phys = ata_id_log2_per_physical_sector(dev->id);
|
||||
lowest_aligned = ata_id_logical_sector_offset(dev->id, log2_per_phys);
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
if (args->cmd->cmnd[0] == READ_CAPACITY) {
|
||||
if (last_lba >= 0xffffffffULL)
|
||||
last_lba = 0xffffffff;
|
||||
@ -2481,7 +2454,6 @@ static unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf)
|
||||
*/
|
||||
static unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf)
|
||||
{
|
||||
VPRINTK("ENTER\n");
|
||||
rbuf[3] = 8; /* just one lun, LUN 0, size 8 bytes */
|
||||
|
||||
return 0;
|
||||
@ -2512,8 +2484,6 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
|
||||
struct ata_port *ap = qc->ap;
|
||||
struct scsi_cmnd *cmd = qc->scsicmd;
|
||||
|
||||
DPRINTK("ATAPI request sense\n");
|
||||
|
||||
memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
|
||||
|
||||
#ifdef CONFIG_ATA_SFF
|
||||
@ -2552,8 +2522,6 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
|
||||
qc->complete_fn = atapi_sense_complete;
|
||||
|
||||
ata_qc_issue(qc);
|
||||
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2581,8 +2549,6 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
|
||||
struct scsi_cmnd *cmd = qc->scsicmd;
|
||||
unsigned int err_mask = qc->err_mask;
|
||||
|
||||
VPRINTK("ENTER, err_mask 0x%X\n", err_mask);
|
||||
|
||||
/* handle completion from new EH */
|
||||
if (unlikely(qc->ap->ops->error_handler &&
|
||||
(err_mask || qc->flags & ATA_QCFLAG_SENSE_VALID))) {
|
||||
@ -2663,7 +2629,6 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
|
||||
qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
|
||||
if (scmd->sc_data_direction == DMA_TO_DEVICE) {
|
||||
qc->tf.flags |= ATA_TFLAG_WRITE;
|
||||
DPRINTK("direction: write\n");
|
||||
}
|
||||
|
||||
qc->tf.command = ATA_CMD_PACKET;
|
||||
@ -3591,10 +3556,7 @@ static int ata_mselect_caching(struct ata_queued_cmd *qc,
|
||||
*/
|
||||
|
||||
if (len != CACHE_MPAGE_LEN - 2) {
|
||||
if (len < CACHE_MPAGE_LEN - 2)
|
||||
*fp = len;
|
||||
else
|
||||
*fp = CACHE_MPAGE_LEN - 2;
|
||||
*fp = min(len, CACHE_MPAGE_LEN - 2);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -3647,10 +3609,7 @@ static int ata_mselect_control(struct ata_queued_cmd *qc,
|
||||
*/
|
||||
|
||||
if (len != CONTROL_MPAGE_LEN - 2) {
|
||||
if (len < CONTROL_MPAGE_LEN - 2)
|
||||
*fp = len;
|
||||
else
|
||||
*fp = CONTROL_MPAGE_LEN - 2;
|
||||
*fp = min(len, CONTROL_MPAGE_LEN - 2);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -3698,8 +3657,6 @@ static unsigned int ata_scsi_mode_select_xlat(struct ata_queued_cmd *qc)
|
||||
u8 buffer[64];
|
||||
const u8 *p = buffer;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
six_byte = (cdb[0] == MODE_SELECT);
|
||||
if (six_byte) {
|
||||
if (scmd->cmd_len < 5) {
|
||||
@ -3997,70 +3954,45 @@ static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_scsi_dump_cdb - dump SCSI command contents to dmesg
|
||||
* @ap: ATA port to which the command was being sent
|
||||
* @cmd: SCSI command to dump
|
||||
*
|
||||
* Prints the contents of a SCSI command via printk().
|
||||
*/
|
||||
|
||||
void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd)
|
||||
{
|
||||
#ifdef ATA_VERBOSE_DEBUG
|
||||
struct scsi_device *scsidev = cmd->device;
|
||||
|
||||
VPRINTK("CDB (%u:%d,%d,%lld) %9ph\n",
|
||||
ap->print_id,
|
||||
scsidev->channel, scsidev->id, scsidev->lun,
|
||||
cmd->cmnd);
|
||||
#endif
|
||||
}
|
||||
|
||||
int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev)
|
||||
{
|
||||
u8 scsi_op = scmd->cmnd[0];
|
||||
ata_xlat_func_t xlat_func;
|
||||
int rc = 0;
|
||||
|
||||
if (unlikely(!scmd->cmd_len))
|
||||
goto bad_cdb_len;
|
||||
|
||||
if (dev->class == ATA_DEV_ATA || dev->class == ATA_DEV_ZAC) {
|
||||
if (unlikely(!scmd->cmd_len || scmd->cmd_len > dev->cdb_len))
|
||||
if (unlikely(scmd->cmd_len > dev->cdb_len))
|
||||
goto bad_cdb_len;
|
||||
|
||||
xlat_func = ata_get_xlat_func(dev, scsi_op);
|
||||
} else {
|
||||
if (unlikely(!scmd->cmd_len))
|
||||
} else if (likely((scsi_op != ATA_16) || !atapi_passthru16)) {
|
||||
/* relay SCSI command to ATAPI device */
|
||||
int len = COMMAND_SIZE(scsi_op);
|
||||
|
||||
if (unlikely(len > scmd->cmd_len ||
|
||||
len > dev->cdb_len ||
|
||||
scmd->cmd_len > ATAPI_CDB_LEN))
|
||||
goto bad_cdb_len;
|
||||
|
||||
xlat_func = NULL;
|
||||
if (likely((scsi_op != ATA_16) || !atapi_passthru16)) {
|
||||
/* relay SCSI command to ATAPI device */
|
||||
int len = COMMAND_SIZE(scsi_op);
|
||||
if (unlikely(len > scmd->cmd_len ||
|
||||
len > dev->cdb_len ||
|
||||
scmd->cmd_len > ATAPI_CDB_LEN))
|
||||
goto bad_cdb_len;
|
||||
xlat_func = atapi_xlat;
|
||||
} else {
|
||||
/* ATA_16 passthru, treat as an ATA command */
|
||||
if (unlikely(scmd->cmd_len > 16))
|
||||
goto bad_cdb_len;
|
||||
|
||||
xlat_func = atapi_xlat;
|
||||
} else {
|
||||
/* ATA_16 passthru, treat as an ATA command */
|
||||
if (unlikely(scmd->cmd_len > 16))
|
||||
goto bad_cdb_len;
|
||||
|
||||
xlat_func = ata_get_xlat_func(dev, scsi_op);
|
||||
}
|
||||
xlat_func = ata_get_xlat_func(dev, scsi_op);
|
||||
}
|
||||
|
||||
if (xlat_func)
|
||||
rc = ata_scsi_translate(dev, scmd, xlat_func);
|
||||
else
|
||||
ata_scsi_simulate(dev, scmd);
|
||||
return ata_scsi_translate(dev, scmd, xlat_func);
|
||||
|
||||
return rc;
|
||||
ata_scsi_simulate(dev, scmd);
|
||||
|
||||
return 0;
|
||||
|
||||
bad_cdb_len:
|
||||
DPRINTK("bad CDB len=%u, scsi_op=0x%02x, max=%u\n",
|
||||
scmd->cmd_len, scsi_op, dev->cdb_len);
|
||||
scmd->result = DID_ERROR << 16;
|
||||
scsi_done(scmd);
|
||||
return 0;
|
||||
@ -4097,8 +4029,6 @@ int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
|
||||
|
||||
spin_lock_irqsave(ap->lock, irq_flags);
|
||||
|
||||
ata_scsi_dump_cdb(ap, cmd);
|
||||
|
||||
dev = ata_scsi_find_dev(ap, scsidev);
|
||||
if (likely(dev))
|
||||
rc = __ata_scsi_queuecmd(cmd, dev);
|
||||
@ -4531,12 +4461,9 @@ void ata_scsi_hotplug(struct work_struct *work)
|
||||
container_of(work, struct ata_port, hotplug_task.work);
|
||||
int i;
|
||||
|
||||
if (ap->pflags & ATA_PFLAG_UNLOADING) {
|
||||
DPRINTK("ENTER/EXIT - unloading\n");
|
||||
if (ap->pflags & ATA_PFLAG_UNLOADING)
|
||||
return;
|
||||
}
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
mutex_lock(&ap->scsi_scan_mutex);
|
||||
|
||||
/* Unplug detached devices. We cannot use link iterator here
|
||||
@ -4552,7 +4479,6 @@ void ata_scsi_hotplug(struct work_struct *work)
|
||||
ata_scsi_scan_host(ap, 0);
|
||||
|
||||
mutex_unlock(&ap->scsi_scan_mutex);
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/highmem.h>
|
||||
|
||||
#include <trace/events/libata.h>
|
||||
#include "libata.h"
|
||||
|
||||
static struct workqueue_struct *ata_sff_wq;
|
||||
@ -330,10 +330,6 @@ EXPORT_SYMBOL_GPL(ata_sff_dev_select);
|
||||
static void ata_dev_select(struct ata_port *ap, unsigned int device,
|
||||
unsigned int wait, unsigned int can_sleep)
|
||||
{
|
||||
if (ata_msg_probe(ap))
|
||||
ata_port_info(ap, "ata_dev_select: ENTER, device %u, wait %u\n",
|
||||
device, wait);
|
||||
|
||||
if (wait)
|
||||
ata_wait_idle(ap);
|
||||
|
||||
@ -409,12 +405,6 @@ void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||
iowrite8(tf->hob_lbal, ioaddr->lbal_addr);
|
||||
iowrite8(tf->hob_lbam, ioaddr->lbam_addr);
|
||||
iowrite8(tf->hob_lbah, ioaddr->lbah_addr);
|
||||
VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n",
|
||||
tf->hob_feature,
|
||||
tf->hob_nsect,
|
||||
tf->hob_lbal,
|
||||
tf->hob_lbam,
|
||||
tf->hob_lbah);
|
||||
}
|
||||
|
||||
if (is_addr) {
|
||||
@ -423,18 +413,10 @@ void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||
iowrite8(tf->lbal, ioaddr->lbal_addr);
|
||||
iowrite8(tf->lbam, ioaddr->lbam_addr);
|
||||
iowrite8(tf->lbah, ioaddr->lbah_addr);
|
||||
VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n",
|
||||
tf->feature,
|
||||
tf->nsect,
|
||||
tf->lbal,
|
||||
tf->lbam,
|
||||
tf->lbah);
|
||||
}
|
||||
|
||||
if (tf->flags & ATA_TFLAG_DEVICE) {
|
||||
if (tf->flags & ATA_TFLAG_DEVICE)
|
||||
iowrite8(tf->device, ioaddr->device_addr);
|
||||
VPRINTK("device 0x%X\n", tf->device);
|
||||
}
|
||||
|
||||
ata_wait_idle(ap);
|
||||
}
|
||||
@ -494,8 +476,6 @@ EXPORT_SYMBOL_GPL(ata_sff_tf_read);
|
||||
*/
|
||||
void ata_sff_exec_command(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||
{
|
||||
DPRINTK("ata%u: cmd 0x%X\n", ap->print_id, tf->command);
|
||||
|
||||
iowrite8(tf->command, ap->ioaddr.command_addr);
|
||||
ata_sff_pause(ap);
|
||||
}
|
||||
@ -505,6 +485,7 @@ EXPORT_SYMBOL_GPL(ata_sff_exec_command);
|
||||
* ata_tf_to_host - issue ATA taskfile to host controller
|
||||
* @ap: port to which command is being issued
|
||||
* @tf: ATA taskfile register set
|
||||
* @tag: tag of the associated command
|
||||
*
|
||||
* Issues ATA taskfile register set to ATA host controller,
|
||||
* with proper synchronization with interrupt handler and
|
||||
@ -514,9 +495,12 @@ EXPORT_SYMBOL_GPL(ata_sff_exec_command);
|
||||
* spin_lock_irqsave(host lock)
|
||||
*/
|
||||
static inline void ata_tf_to_host(struct ata_port *ap,
|
||||
const struct ata_taskfile *tf)
|
||||
const struct ata_taskfile *tf,
|
||||
unsigned int tag)
|
||||
{
|
||||
trace_ata_tf_load(ap, tf);
|
||||
ap->ops->sff_tf_load(ap, tf);
|
||||
trace_ata_exec_command(ap, tf, tag);
|
||||
ap->ops->sff_exec_command(ap, tf);
|
||||
}
|
||||
|
||||
@ -680,7 +664,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
|
||||
page = nth_page(page, (offset >> PAGE_SHIFT));
|
||||
offset %= PAGE_SIZE;
|
||||
|
||||
DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
|
||||
trace_ata_sff_pio_transfer_data(qc, offset, qc->sect_size);
|
||||
|
||||
/*
|
||||
* Split the transfer when it splits a page boundary. Note that the
|
||||
@ -750,7 +734,7 @@ static void ata_pio_sectors(struct ata_queued_cmd *qc)
|
||||
static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc)
|
||||
{
|
||||
/* send SCSI cdb */
|
||||
DPRINTK("send cdb\n");
|
||||
trace_atapi_send_cdb(qc, 0, qc->dev->cdb_len);
|
||||
WARN_ON_ONCE(qc->dev->cdb_len < 12);
|
||||
|
||||
ap->ops->sff_data_xfer(qc, qc->cdb, qc->dev->cdb_len, 1);
|
||||
@ -768,6 +752,7 @@ static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc)
|
||||
case ATAPI_PROT_DMA:
|
||||
ap->hsm_task_state = HSM_ST_LAST;
|
||||
/* initiate bmdma */
|
||||
trace_ata_bmdma_start(ap, &qc->tf, qc->tag);
|
||||
ap->ops->bmdma_start(qc);
|
||||
break;
|
||||
#endif /* CONFIG_ATA_BMDMA */
|
||||
@ -820,7 +805,7 @@ static int __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
|
||||
/* don't cross page boundaries */
|
||||
count = min(count, (unsigned int)PAGE_SIZE - offset);
|
||||
|
||||
DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
|
||||
trace_atapi_pio_transfer_data(qc, offset, count);
|
||||
|
||||
/* do the actual data transfer */
|
||||
buf = kmap_atomic(page);
|
||||
@ -888,8 +873,6 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
|
||||
if (unlikely(!bytes))
|
||||
goto atapi_check;
|
||||
|
||||
VPRINTK("ata%u: xfering %d bytes\n", ap->print_id, bytes);
|
||||
|
||||
if (unlikely(__atapi_pio_bytes(qc, bytes)))
|
||||
goto err_out;
|
||||
ata_sff_sync(ap); /* flush */
|
||||
@ -1002,8 +985,7 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
||||
WARN_ON_ONCE(in_wq != ata_hsm_ok_in_wq(ap, qc));
|
||||
|
||||
fsm_start:
|
||||
DPRINTK("ata%u: protocol %d task_state %d (dev_stat 0x%X)\n",
|
||||
ap->print_id, qc->tf.protocol, ap->hsm_task_state, status);
|
||||
trace_ata_sff_hsm_state(qc, status);
|
||||
|
||||
switch (ap->hsm_task_state) {
|
||||
case HSM_ST_FIRST:
|
||||
@ -1204,8 +1186,7 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
||||
}
|
||||
|
||||
/* no more data to transfer */
|
||||
DPRINTK("ata%u: dev %u command complete, drv_stat 0x%x\n",
|
||||
ap->print_id, qc->dev->devno, status);
|
||||
trace_ata_sff_hsm_command_complete(qc, status);
|
||||
|
||||
WARN_ON_ONCE(qc->err_mask & (AC_ERR_DEV | AC_ERR_HSM));
|
||||
|
||||
@ -1262,7 +1243,7 @@ EXPORT_SYMBOL_GPL(ata_sff_queue_pio_task);
|
||||
|
||||
void ata_sff_flush_pio_task(struct ata_port *ap)
|
||||
{
|
||||
DPRINTK("ENTER\n");
|
||||
trace_ata_sff_flush_pio_task(ap);
|
||||
|
||||
cancel_delayed_work_sync(&ap->sff_pio_task);
|
||||
|
||||
@ -1279,9 +1260,6 @@ void ata_sff_flush_pio_task(struct ata_port *ap)
|
||||
spin_unlock_irq(ap->lock);
|
||||
|
||||
ap->sff_pio_task_link = NULL;
|
||||
|
||||
if (ata_msg_ctl(ap))
|
||||
ata_port_dbg(ap, "%s: EXIT\n", __func__);
|
||||
}
|
||||
|
||||
static void ata_sff_pio_task(struct work_struct *work)
|
||||
@ -1376,7 +1354,7 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
|
||||
if (qc->tf.flags & ATA_TFLAG_POLLING)
|
||||
ata_qc_set_polling(qc);
|
||||
|
||||
ata_tf_to_host(ap, &qc->tf);
|
||||
ata_tf_to_host(ap, &qc->tf, qc->tag);
|
||||
ap->hsm_task_state = HSM_ST_LAST;
|
||||
|
||||
if (qc->tf.flags & ATA_TFLAG_POLLING)
|
||||
@ -1388,7 +1366,7 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
|
||||
if (qc->tf.flags & ATA_TFLAG_POLLING)
|
||||
ata_qc_set_polling(qc);
|
||||
|
||||
ata_tf_to_host(ap, &qc->tf);
|
||||
ata_tf_to_host(ap, &qc->tf, qc->tag);
|
||||
|
||||
if (qc->tf.flags & ATA_TFLAG_WRITE) {
|
||||
/* PIO data out protocol */
|
||||
@ -1418,7 +1396,7 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
|
||||
if (qc->tf.flags & ATA_TFLAG_POLLING)
|
||||
ata_qc_set_polling(qc);
|
||||
|
||||
ata_tf_to_host(ap, &qc->tf);
|
||||
ata_tf_to_host(ap, &qc->tf, qc->tag);
|
||||
|
||||
ap->hsm_task_state = HSM_ST_FIRST;
|
||||
|
||||
@ -1478,8 +1456,7 @@ static unsigned int __ata_sff_port_intr(struct ata_port *ap,
|
||||
{
|
||||
u8 status;
|
||||
|
||||
VPRINTK("ata%u: protocol %d task_state %d\n",
|
||||
ap->print_id, qc->tf.protocol, ap->hsm_task_state);
|
||||
trace_ata_sff_port_intr(qc, hsmv_on_idle);
|
||||
|
||||
/* Check whether we are expecting interrupt in this state */
|
||||
switch (ap->hsm_task_state) {
|
||||
@ -1853,7 +1830,7 @@ unsigned int ata_sff_dev_classify(struct ata_device *dev, int present,
|
||||
return ATA_DEV_NONE;
|
||||
|
||||
/* determine if device is ATA or ATAPI */
|
||||
class = ata_dev_classify(&tf);
|
||||
class = ata_port_classify(ap, &tf);
|
||||
|
||||
if (class == ATA_DEV_UNKNOWN) {
|
||||
/* If the device failed diagnostic, it's likely to
|
||||
@ -1956,8 +1933,6 @@ static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,
|
||||
{
|
||||
struct ata_ioports *ioaddr = &ap->ioaddr;
|
||||
|
||||
DPRINTK("ata%u: bus reset via SRST\n", ap->print_id);
|
||||
|
||||
if (ap->ioaddr.ctl_addr) {
|
||||
/* software reset. causes dev0 to be selected */
|
||||
iowrite8(ap->ctl, ioaddr->ctl_addr);
|
||||
@ -1995,8 +1970,6 @@ int ata_sff_softreset(struct ata_link *link, unsigned int *classes,
|
||||
int rc;
|
||||
u8 err;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
/* determine if device 0/1 are present */
|
||||
if (ata_devchk(ap, 0))
|
||||
devmask |= (1 << 0);
|
||||
@ -2007,7 +1980,6 @@ int ata_sff_softreset(struct ata_link *link, unsigned int *classes,
|
||||
ap->ops->sff_dev_select(ap, 0);
|
||||
|
||||
/* issue bus reset */
|
||||
DPRINTK("about to softreset, devmask=%x\n", devmask);
|
||||
rc = ata_bus_softreset(ap, devmask, deadline);
|
||||
/* if link is occupied, -ENODEV too is an error */
|
||||
if (rc && (rc != -ENODEV || sata_scr_valid(link))) {
|
||||
@ -2022,7 +1994,6 @@ int ata_sff_softreset(struct ata_link *link, unsigned int *classes,
|
||||
classes[1] = ata_sff_dev_classify(&link->device[1],
|
||||
devmask & (1 << 1), &err);
|
||||
|
||||
DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sff_softreset);
|
||||
@ -2055,7 +2026,6 @@ int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
|
||||
if (online)
|
||||
*class = ata_sff_dev_classify(link->device, 1, NULL);
|
||||
|
||||
DPRINTK("EXIT, class=%u\n", *class);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sata_sff_hardreset);
|
||||
@ -2085,10 +2055,8 @@ void ata_sff_postreset(struct ata_link *link, unsigned int *classes)
|
||||
ap->ops->sff_dev_select(ap, 0);
|
||||
|
||||
/* bail out if no device is present */
|
||||
if (classes[0] == ATA_DEV_NONE && classes[1] == ATA_DEV_NONE) {
|
||||
DPRINTK("EXIT, no device\n");
|
||||
if (classes[0] == ATA_DEV_NONE && classes[1] == ATA_DEV_NONE)
|
||||
return;
|
||||
}
|
||||
|
||||
/* set up device control */
|
||||
if (ap->ops->sff_set_devctl || ap->ioaddr.ctl_addr) {
|
||||
@ -2123,7 +2091,6 @@ void ata_sff_drain_fifo(struct ata_queued_cmd *qc)
|
||||
&& count < 65536; count += 2)
|
||||
ioread16(ap->ioaddr.data_addr);
|
||||
|
||||
/* Can become DEBUG later */
|
||||
if (count)
|
||||
ata_port_dbg(ap, "drained %d bytes to clear DRQ\n", count);
|
||||
|
||||
@ -2467,8 +2434,6 @@ static int ata_pci_init_one(struct pci_dev *pdev,
|
||||
struct ata_host *host = NULL;
|
||||
int rc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
pi = ata_sff_find_valid_pi(ppi);
|
||||
if (!pi) {
|
||||
dev_err(&pdev->dev, "no valid port_info specified\n");
|
||||
@ -2614,7 +2579,6 @@ static void ata_bmdma_fill_sg(struct ata_queued_cmd *qc)
|
||||
|
||||
prd[pi].addr = cpu_to_le32(addr);
|
||||
prd[pi].flags_len = cpu_to_le32(len & 0xffff);
|
||||
VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", pi, addr, len);
|
||||
|
||||
pi++;
|
||||
sg_len -= len;
|
||||
@ -2674,7 +2638,6 @@ static void ata_bmdma_fill_sg_dumb(struct ata_queued_cmd *qc)
|
||||
prd[++pi].addr = cpu_to_le32(addr + 0x8000);
|
||||
}
|
||||
prd[pi].flags_len = cpu_to_le32(blen);
|
||||
VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", pi, addr, len);
|
||||
|
||||
pi++;
|
||||
sg_len -= len;
|
||||
@ -2756,8 +2719,11 @@ unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc)
|
||||
case ATA_PROT_DMA:
|
||||
WARN_ON_ONCE(qc->tf.flags & ATA_TFLAG_POLLING);
|
||||
|
||||
trace_ata_tf_load(ap, &qc->tf);
|
||||
ap->ops->sff_tf_load(ap, &qc->tf); /* load tf registers */
|
||||
trace_ata_bmdma_setup(ap, &qc->tf, qc->tag);
|
||||
ap->ops->bmdma_setup(qc); /* set up bmdma */
|
||||
trace_ata_bmdma_start(ap, &qc->tf, qc->tag);
|
||||
ap->ops->bmdma_start(qc); /* initiate bmdma */
|
||||
ap->hsm_task_state = HSM_ST_LAST;
|
||||
break;
|
||||
@ -2765,7 +2731,9 @@ unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc)
|
||||
case ATAPI_PROT_DMA:
|
||||
WARN_ON_ONCE(qc->tf.flags & ATA_TFLAG_POLLING);
|
||||
|
||||
trace_ata_tf_load(ap, &qc->tf);
|
||||
ap->ops->sff_tf_load(ap, &qc->tf); /* load tf registers */
|
||||
trace_ata_bmdma_setup(ap, &qc->tf, qc->tag);
|
||||
ap->ops->bmdma_setup(qc); /* set up bmdma */
|
||||
ap->hsm_task_state = HSM_ST_FIRST;
|
||||
|
||||
@ -2806,13 +2774,14 @@ unsigned int ata_bmdma_port_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
|
||||
if (ap->hsm_task_state == HSM_ST_LAST && ata_is_dma(qc->tf.protocol)) {
|
||||
/* check status of DMA engine */
|
||||
host_stat = ap->ops->bmdma_status(ap);
|
||||
VPRINTK("ata%u: host_stat 0x%X\n", ap->print_id, host_stat);
|
||||
trace_ata_bmdma_status(ap, host_stat);
|
||||
|
||||
/* if it's not our irq... */
|
||||
if (!(host_stat & ATA_DMA_INTR))
|
||||
return ata_sff_idle_irq(ap);
|
||||
|
||||
/* before we do anything else, clear DMA-Start bit */
|
||||
trace_ata_bmdma_stop(ap, &qc->tf, qc->tag);
|
||||
ap->ops->bmdma_stop(qc);
|
||||
bmdma_stopped = true;
|
||||
|
||||
@ -2881,6 +2850,7 @@ void ata_bmdma_error_handler(struct ata_port *ap)
|
||||
u8 host_stat;
|
||||
|
||||
host_stat = ap->ops->bmdma_status(ap);
|
||||
trace_ata_bmdma_status(ap, host_stat);
|
||||
|
||||
/* BMDMA controllers indicate host bus error by
|
||||
* setting DMA_ERR bit and timing out. As it wasn't
|
||||
@ -2892,6 +2862,7 @@ void ata_bmdma_error_handler(struct ata_port *ap)
|
||||
thaw = true;
|
||||
}
|
||||
|
||||
trace_ata_bmdma_stop(ap, &qc->tf, qc->tag);
|
||||
ap->ops->bmdma_stop(qc);
|
||||
|
||||
/* if we're gonna thaw, make sure IRQ is clear */
|
||||
@ -2925,6 +2896,7 @@ void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc)
|
||||
|
||||
if (ata_is_dma(qc->tf.protocol)) {
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
trace_ata_bmdma_stop(ap, &qc->tf, qc->tag);
|
||||
ap->ops->bmdma_stop(qc);
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
}
|
||||
|
@ -38,6 +38,24 @@ libata_trace_parse_status(struct trace_seq *p, unsigned char status)
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char *
|
||||
libata_trace_parse_host_stat(struct trace_seq *p, unsigned char host_stat)
|
||||
{
|
||||
const char *ret = trace_seq_buffer_ptr(p);
|
||||
|
||||
trace_seq_printf(p, "{ ");
|
||||
if (host_stat & ATA_DMA_INTR)
|
||||
trace_seq_printf(p, "INTR ");
|
||||
if (host_stat & ATA_DMA_ERR)
|
||||
trace_seq_printf(p, "ERR ");
|
||||
if (host_stat & ATA_DMA_ACTIVE)
|
||||
trace_seq_printf(p, "ACTIVE ");
|
||||
trace_seq_putc(p, '}');
|
||||
trace_seq_putc(p, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char *
|
||||
libata_trace_parse_eh_action(struct trace_seq *p, unsigned int eh_action)
|
||||
{
|
||||
@ -137,6 +155,35 @@ libata_trace_parse_qc_flags(struct trace_seq *p, unsigned int qc_flags)
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char *
|
||||
libata_trace_parse_tf_flags(struct trace_seq *p, unsigned int tf_flags)
|
||||
{
|
||||
const char *ret = trace_seq_buffer_ptr(p);
|
||||
|
||||
trace_seq_printf(p, "%x", tf_flags);
|
||||
if (tf_flags) {
|
||||
trace_seq_printf(p, "{ ");
|
||||
if (tf_flags & ATA_TFLAG_LBA48)
|
||||
trace_seq_printf(p, "LBA48 ");
|
||||
if (tf_flags & ATA_TFLAG_ISADDR)
|
||||
trace_seq_printf(p, "ISADDR ");
|
||||
if (tf_flags & ATA_TFLAG_DEVICE)
|
||||
trace_seq_printf(p, "DEV ");
|
||||
if (tf_flags & ATA_TFLAG_WRITE)
|
||||
trace_seq_printf(p, "WRITE ");
|
||||
if (tf_flags & ATA_TFLAG_LBA)
|
||||
trace_seq_printf(p, "LBA ");
|
||||
if (tf_flags & ATA_TFLAG_FUA)
|
||||
trace_seq_printf(p, "FUA ");
|
||||
if (tf_flags & ATA_TFLAG_POLLING)
|
||||
trace_seq_printf(p, "POLL ");
|
||||
trace_seq_putc(p, '}');
|
||||
}
|
||||
trace_seq_putc(p, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char *
|
||||
libata_trace_parse_subcmd(struct trace_seq *p, unsigned char cmd,
|
||||
unsigned char feature, unsigned char hob_nsect)
|
||||
|
@ -163,7 +163,7 @@ static struct {
|
||||
{ AC_ERR_INVALID, "InvalidArg" },
|
||||
{ AC_ERR_OTHER, "Unknown" },
|
||||
{ AC_ERR_NODEV_HINT, "NoDeviceHint" },
|
||||
{ AC_ERR_NCQ, "NCQError" }
|
||||
{ AC_ERR_NCQ, "NCQError" }
|
||||
};
|
||||
ata_bitfield_name_match(err, ata_err_names)
|
||||
|
||||
@ -321,13 +321,43 @@ int ata_tport_add(struct device *parent,
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_port_classify - determine device type based on ATA-spec signature
|
||||
* @ap: ATA port device on which the classification should be run
|
||||
* @tf: ATA taskfile register set for device to be identified
|
||||
*
|
||||
* A wrapper around ata_dev_classify() to provide additional logging
|
||||
*
|
||||
* RETURNS:
|
||||
* Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP,
|
||||
* %ATA_DEV_ZAC, or %ATA_DEV_UNKNOWN the event of failure.
|
||||
*/
|
||||
unsigned int ata_port_classify(struct ata_port *ap,
|
||||
const struct ata_taskfile *tf)
|
||||
{
|
||||
int i;
|
||||
unsigned int class = ata_dev_classify(tf);
|
||||
|
||||
/* Start with index '1' to skip the 'unknown' entry */
|
||||
for (i = 1; i < ARRAY_SIZE(ata_class_names); i++) {
|
||||
if (ata_class_names[i].value == class) {
|
||||
ata_port_dbg(ap, "found %s device by sig\n",
|
||||
ata_class_names[i].name);
|
||||
return class;
|
||||
}
|
||||
}
|
||||
|
||||
ata_port_info(ap, "found unknown device (class %u)\n", class);
|
||||
return class;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_port_classify);
|
||||
|
||||
/*
|
||||
* ATA link attributes
|
||||
*/
|
||||
static int noop(int x) { return x; }
|
||||
|
||||
#define ata_link_show_linkspeed(field, format) \
|
||||
#define ata_link_show_linkspeed(field, format) \
|
||||
static ssize_t \
|
||||
show_ata_link_##field(struct device *dev, \
|
||||
struct device_attribute *attr, char *buf) \
|
||||
@ -416,7 +446,7 @@ int ata_tlink_add(struct ata_link *link)
|
||||
dev->release = ata_tlink_release;
|
||||
if (ata_is_host_link(link))
|
||||
dev_set_name(dev, "link%d", ap->print_id);
|
||||
else
|
||||
else
|
||||
dev_set_name(dev, "link%d.%d", ap->print_id, link->pmp);
|
||||
|
||||
transport_setup_device(dev);
|
||||
@ -472,7 +502,7 @@ ata_dev_attr(xfer, dma_mode);
|
||||
ata_dev_attr(xfer, xfer_mode);
|
||||
|
||||
|
||||
#define ata_dev_show_simple(field, format_string, cast) \
|
||||
#define ata_dev_show_simple(field, format_string, cast) \
|
||||
static ssize_t \
|
||||
show_ata_dev_##field(struct device *dev, \
|
||||
struct device_attribute *attr, char *buf) \
|
||||
@ -482,9 +512,9 @@ show_ata_dev_##field(struct device *dev, \
|
||||
return scnprintf(buf, 20, format_string, cast ata_dev->field); \
|
||||
}
|
||||
|
||||
#define ata_dev_simple_attr(field, format_string, type) \
|
||||
#define ata_dev_simple_attr(field, format_string, type) \
|
||||
ata_dev_show_simple(field, format_string, (type)) \
|
||||
static DEVICE_ATTR(field, S_IRUGO, \
|
||||
static DEVICE_ATTR(field, S_IRUGO, \
|
||||
show_ata_dev_##field, NULL)
|
||||
|
||||
ata_dev_simple_attr(spdn_cnt, "%d\n", int);
|
||||
@ -502,7 +532,7 @@ static int ata_show_ering(struct ata_ering_entry *ent, void *void_arg)
|
||||
|
||||
seconds = div_u64_rem(ent->timestamp, HZ, &rem);
|
||||
arg->written += sprintf(arg->buf + arg->written,
|
||||
"[%5llu.%09lu]", seconds,
|
||||
"[%5llu.%09lu]", seconds,
|
||||
rem * NSEC_PER_SEC / HZ);
|
||||
arg->written += get_ata_err_names(ent->err_mask,
|
||||
arg->buf + arg->written);
|
||||
@ -667,7 +697,7 @@ static int ata_tdev_add(struct ata_device *ata_dev)
|
||||
dev->release = ata_tdev_release;
|
||||
if (ata_is_host_link(link))
|
||||
dev_set_name(dev, "dev%d.%d", ap->print_id,ata_dev->devno);
|
||||
else
|
||||
else
|
||||
dev_set_name(dev, "dev%d.%d.0", ap->print_id, link->pmp);
|
||||
|
||||
transport_setup_device(dev);
|
||||
@ -689,7 +719,7 @@ static int ata_tdev_add(struct ata_device *ata_dev)
|
||||
*/
|
||||
|
||||
#define SETUP_TEMPLATE(attrb, field, perm, test) \
|
||||
i->private_##attrb[count] = dev_attr_##field; \
|
||||
i->private_##attrb[count] = dev_attr_##field; \
|
||||
i->private_##attrb[count].attr.mode = perm; \
|
||||
i->attrb[count] = &i->private_##attrb[count]; \
|
||||
if (test) \
|
||||
|
@ -148,7 +148,6 @@ extern int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
|
||||
unsigned int id, u64 lun);
|
||||
void ata_scsi_sdev_config(struct scsi_device *sdev);
|
||||
int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev);
|
||||
void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd);
|
||||
int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev);
|
||||
|
||||
/* libata-eh.c */
|
||||
@ -166,7 +165,7 @@ extern void ata_eh_about_to_do(struct ata_link *link, struct ata_device *dev,
|
||||
extern void ata_eh_done(struct ata_link *link, struct ata_device *dev,
|
||||
unsigned int action);
|
||||
extern void ata_eh_autopsy(struct ata_port *ap);
|
||||
const char *ata_get_cmd_descript(u8 command);
|
||||
const char *ata_get_cmd_name(u8 command);
|
||||
extern void ata_eh_report(struct ata_port *ap);
|
||||
extern int ata_eh_reset(struct ata_link *link, int classify,
|
||||
ata_prereset_fn_t prereset, ata_reset_fn_t softreset,
|
||||
@ -179,7 +178,7 @@ extern int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
|
||||
extern void ata_eh_finish(struct ata_port *ap);
|
||||
extern int ata_ering_map(struct ata_ering *ering,
|
||||
int (*map_fn)(struct ata_ering_entry *, void *),
|
||||
void *arg);
|
||||
void *arg);
|
||||
extern unsigned int atapi_eh_tur(struct ata_device *dev, u8 *r_sense_key);
|
||||
extern unsigned int atapi_eh_request_sense(struct ata_device *dev,
|
||||
u8 *sense_buf, u8 dfl_sense_key);
|
||||
|
@ -37,7 +37,7 @@
|
||||
#define DRV_NAME "pata_ali"
|
||||
#define DRV_VERSION "0.7.8"
|
||||
|
||||
static int ali_atapi_dma = 0;
|
||||
static int ali_atapi_dma;
|
||||
module_param_named(atapi_dma, ali_atapi_dma, int, 0644);
|
||||
MODULE_PARM_DESC(atapi_dma, "Enable ATAPI DMA (0=disable, 1=enable)");
|
||||
|
||||
@ -123,7 +123,7 @@ static unsigned long ali_20_filter(struct ata_device *adev, unsigned long mask)
|
||||
mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
|
||||
ata_id_c_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num));
|
||||
if (strstr(model_num, "WDC"))
|
||||
return mask &= ~ATA_MASK_UDMA;
|
||||
mask &= ~ATA_MASK_UDMA;
|
||||
return mask;
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <trace/events/libata.h>
|
||||
|
||||
#define DRIVER_NAME "arasan_cf"
|
||||
#define TIMEOUT msecs_to_jiffies(3000)
|
||||
@ -703,9 +704,11 @@ static unsigned int arasan_cf_qc_issue(struct ata_queued_cmd *qc)
|
||||
case ATA_PROT_DMA:
|
||||
WARN_ON_ONCE(qc->tf.flags & ATA_TFLAG_POLLING);
|
||||
|
||||
trace_ata_tf_load(ap, &qc->tf);
|
||||
ap->ops->sff_tf_load(ap, &qc->tf);
|
||||
acdev->dma_status = 0;
|
||||
acdev->qc = qc;
|
||||
trace_ata_bmdma_start(ap, &qc->tf, qc->tag);
|
||||
arasan_cf_dma_start(acdev);
|
||||
ap->hsm_task_state = HSM_ST_LAST;
|
||||
break;
|
||||
|
@ -155,7 +155,7 @@ static int atp867x_get_active_clocks_shifted(struct ata_port *ap,
|
||||
case 1 ... 6:
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING "ATP867X: active %dclk is invalid. "
|
||||
ata_port_warn(ap, "ATP867X: active %dclk is invalid. "
|
||||
"Using 12clk.\n", clk);
|
||||
fallthrough;
|
||||
case 9 ... 12:
|
||||
@ -171,7 +171,8 @@ static int atp867x_get_active_clocks_shifted(struct ata_port *ap,
|
||||
return clocks << ATP867X_IO_PIOSPD_ACTIVE_SHIFT;
|
||||
}
|
||||
|
||||
static int atp867x_get_recover_clocks_shifted(unsigned int clk)
|
||||
static int atp867x_get_recover_clocks_shifted(struct ata_port *ap,
|
||||
unsigned int clk)
|
||||
{
|
||||
unsigned char clocks = clk;
|
||||
|
||||
@ -188,7 +189,7 @@ static int atp867x_get_recover_clocks_shifted(unsigned int clk)
|
||||
case 15:
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING "ATP867X: recover %dclk is invalid. "
|
||||
ata_port_warn(ap, "ATP867X: recover %dclk is invalid. "
|
||||
"Using default 12clk.\n", clk);
|
||||
fallthrough;
|
||||
case 12: /* default 12 clk */
|
||||
@ -225,7 +226,7 @@ static void atp867x_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||
iowrite8(b, dp->dma_mode);
|
||||
|
||||
b = atp867x_get_active_clocks_shifted(ap, t.active) |
|
||||
atp867x_get_recover_clocks_shifted(t.recover);
|
||||
atp867x_get_recover_clocks_shifted(ap, t.recover);
|
||||
|
||||
if (adev->devno & 1)
|
||||
iowrite8(b, dp->slave_piospd);
|
||||
@ -233,7 +234,7 @@ static void atp867x_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||
iowrite8(b, dp->mstr_piospd);
|
||||
|
||||
b = atp867x_get_active_clocks_shifted(ap, t.act8b) |
|
||||
atp867x_get_recover_clocks_shifted(t.rec8b);
|
||||
atp867x_get_recover_clocks_shifted(ap, t.rec8b);
|
||||
|
||||
iowrite8(b, dp->eightb_piospd);
|
||||
}
|
||||
@ -270,7 +271,6 @@ static struct ata_port_operations atp867x_ops = {
|
||||
};
|
||||
|
||||
|
||||
#ifdef ATP867X_DEBUG
|
||||
static void atp867x_check_res(struct pci_dev *pdev)
|
||||
{
|
||||
int i;
|
||||
@ -280,7 +280,7 @@ static void atp867x_check_res(struct pci_dev *pdev)
|
||||
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||
start = pci_resource_start(pdev, i);
|
||||
len = pci_resource_len(pdev, i);
|
||||
printk(KERN_DEBUG "ATP867X: resource start:len=%lx:%lx\n",
|
||||
dev_dbg(&pdev->dev, "ATP867X: resource start:len=%lx:%lx\n",
|
||||
start, len);
|
||||
}
|
||||
}
|
||||
@ -290,49 +290,48 @@ static void atp867x_check_ports(struct ata_port *ap, int port)
|
||||
struct ata_ioports *ioaddr = &ap->ioaddr;
|
||||
struct atp867x_priv *dp = ap->private_data;
|
||||
|
||||
printk(KERN_DEBUG "ATP867X: port[%d] addresses\n"
|
||||
" cmd_addr =0x%llx, 0x%llx\n"
|
||||
" ctl_addr =0x%llx, 0x%llx\n"
|
||||
" bmdma_addr =0x%llx, 0x%llx\n"
|
||||
" data_addr =0x%llx\n"
|
||||
" error_addr =0x%llx\n"
|
||||
" feature_addr =0x%llx\n"
|
||||
" nsect_addr =0x%llx\n"
|
||||
" lbal_addr =0x%llx\n"
|
||||
" lbam_addr =0x%llx\n"
|
||||
" lbah_addr =0x%llx\n"
|
||||
" device_addr =0x%llx\n"
|
||||
" status_addr =0x%llx\n"
|
||||
" command_addr =0x%llx\n"
|
||||
" dp->dma_mode =0x%llx\n"
|
||||
" dp->mstr_piospd =0x%llx\n"
|
||||
" dp->slave_piospd =0x%llx\n"
|
||||
" dp->eightb_piospd =0x%llx\n"
|
||||
ata_port_dbg(ap, "ATP867X: port[%d] addresses\n"
|
||||
" cmd_addr =0x%lx, 0x%lx\n"
|
||||
" ctl_addr =0x%lx, 0x%lx\n"
|
||||
" bmdma_addr =0x%lx, 0x%lx\n"
|
||||
" data_addr =0x%lx\n"
|
||||
" error_addr =0x%lx\n"
|
||||
" feature_addr =0x%lx\n"
|
||||
" nsect_addr =0x%lx\n"
|
||||
" lbal_addr =0x%lx\n"
|
||||
" lbam_addr =0x%lx\n"
|
||||
" lbah_addr =0x%lx\n"
|
||||
" device_addr =0x%lx\n"
|
||||
" status_addr =0x%lx\n"
|
||||
" command_addr =0x%lx\n"
|
||||
" dp->dma_mode =0x%lx\n"
|
||||
" dp->mstr_piospd =0x%lx\n"
|
||||
" dp->slave_piospd =0x%lx\n"
|
||||
" dp->eightb_piospd =0x%lx\n"
|
||||
" dp->pci66mhz =0x%lx\n",
|
||||
port,
|
||||
(unsigned long long)ioaddr->cmd_addr,
|
||||
(unsigned long long)ATP867X_IO_PORTBASE(ap, port),
|
||||
(unsigned long long)ioaddr->ctl_addr,
|
||||
(unsigned long long)ATP867X_IO_ALTSTATUS(ap, port),
|
||||
(unsigned long long)ioaddr->bmdma_addr,
|
||||
(unsigned long long)ATP867X_IO_DMABASE(ap, port),
|
||||
(unsigned long long)ioaddr->data_addr,
|
||||
(unsigned long long)ioaddr->error_addr,
|
||||
(unsigned long long)ioaddr->feature_addr,
|
||||
(unsigned long long)ioaddr->nsect_addr,
|
||||
(unsigned long long)ioaddr->lbal_addr,
|
||||
(unsigned long long)ioaddr->lbam_addr,
|
||||
(unsigned long long)ioaddr->lbah_addr,
|
||||
(unsigned long long)ioaddr->device_addr,
|
||||
(unsigned long long)ioaddr->status_addr,
|
||||
(unsigned long long)ioaddr->command_addr,
|
||||
(unsigned long long)dp->dma_mode,
|
||||
(unsigned long long)dp->mstr_piospd,
|
||||
(unsigned long long)dp->slave_piospd,
|
||||
(unsigned long long)dp->eightb_piospd,
|
||||
(unsigned long)ioaddr->cmd_addr,
|
||||
(unsigned long)ATP867X_IO_PORTBASE(ap, port),
|
||||
(unsigned long)ioaddr->ctl_addr,
|
||||
(unsigned long)ATP867X_IO_ALTSTATUS(ap, port),
|
||||
(unsigned long)ioaddr->bmdma_addr,
|
||||
(unsigned long)ATP867X_IO_DMABASE(ap, port),
|
||||
(unsigned long)ioaddr->data_addr,
|
||||
(unsigned long)ioaddr->error_addr,
|
||||
(unsigned long)ioaddr->feature_addr,
|
||||
(unsigned long)ioaddr->nsect_addr,
|
||||
(unsigned long)ioaddr->lbal_addr,
|
||||
(unsigned long)ioaddr->lbam_addr,
|
||||
(unsigned long)ioaddr->lbah_addr,
|
||||
(unsigned long)ioaddr->device_addr,
|
||||
(unsigned long)ioaddr->status_addr,
|
||||
(unsigned long)ioaddr->command_addr,
|
||||
(unsigned long)dp->dma_mode,
|
||||
(unsigned long)dp->mstr_piospd,
|
||||
(unsigned long)dp->slave_piospd,
|
||||
(unsigned long)dp->eightb_piospd,
|
||||
(unsigned long)dp->pci66mhz);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int atp867x_set_priv(struct ata_port *ap)
|
||||
{
|
||||
@ -370,8 +369,7 @@ static void atp867x_fixup(struct ata_host *host)
|
||||
if (v < 0x80) {
|
||||
v = 0x80;
|
||||
pci_write_config_byte(pdev, PCI_LATENCY_TIMER, v);
|
||||
printk(KERN_DEBUG "ATP867X: set latency timer of device %s"
|
||||
" to %d\n", pci_name(pdev), v);
|
||||
dev_dbg(&pdev->dev, "ATP867X: set latency timer to %d\n", v);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -419,13 +417,11 @@ static int atp867x_ata_pci_sff_init_host(struct ata_host *host)
|
||||
return rc;
|
||||
host->iomap = pcim_iomap_table(pdev);
|
||||
|
||||
#ifdef ATP867X_DEBUG
|
||||
atp867x_check_res(pdev);
|
||||
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++)
|
||||
printk(KERN_DEBUG "ATP867X: iomap[%d]=0x%llx\n", i,
|
||||
(unsigned long long)(host->iomap[i]));
|
||||
#endif
|
||||
dev_dbg(gdev, "ATP867X: iomap[%d]=0x%p\n", i,
|
||||
host->iomap[i]);
|
||||
|
||||
/*
|
||||
* request, iomap BARs and init port addresses accordingly
|
||||
@ -444,9 +440,8 @@ static int atp867x_ata_pci_sff_init_host(struct ata_host *host)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
#ifdef ATP867X_DEBUG
|
||||
atp867x_check_ports(ap, i);
|
||||
#endif
|
||||
|
||||
ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx",
|
||||
(unsigned long)ioaddr->cmd_addr,
|
||||
(unsigned long)ioaddr->ctl_addr);
|
||||
@ -486,7 +481,7 @@ static int atp867x_init_one(struct pci_dev *pdev,
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
printk(KERN_INFO "ATP867X: ATP867 ATA UDMA133 controller (rev %02X)",
|
||||
dev_info(&pdev->dev, "ATP867X: ATP867 ATA UDMA133 controller (rev %02X)",
|
||||
pdev->device);
|
||||
|
||||
host = ata_host_alloc_pinfo(&pdev->dev, ppi, ATP867X_NUM_PORTS);
|
||||
|
@ -61,7 +61,7 @@ static void cmd640_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||
struct ata_device *pair = ata_dev_pair(adev);
|
||||
|
||||
if (ata_timing_compute(adev, adev->pio_mode, &t, T, 0) < 0) {
|
||||
printk(KERN_ERR DRV_NAME ": mode computation failed.\n");
|
||||
ata_dev_err(adev, DRV_NAME ": mode computation failed.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -116,7 +116,7 @@ static void cmd64x_set_timing(struct ata_port *ap, struct ata_device *adev, u8 m
|
||||
/* ata_timing_compute is smart and will produce timings for MWDMA
|
||||
that don't violate the drives PIO capabilities. */
|
||||
if (ata_timing_compute(adev, mode, &t, T, 0) < 0) {
|
||||
printk(KERN_ERR DRV_NAME ": mode computation failed.\n");
|
||||
ata_dev_err(adev, DRV_NAME ": mode computation failed.\n");
|
||||
return;
|
||||
}
|
||||
if (ap->port_no) {
|
||||
@ -130,7 +130,7 @@ static void cmd64x_set_timing(struct ata_port *ap, struct ata_device *adev, u8 m
|
||||
}
|
||||
}
|
||||
|
||||
printk(KERN_DEBUG DRV_NAME ": active %d recovery %d setup %d.\n",
|
||||
ata_dev_dbg(adev, DRV_NAME ": active %d recovery %d setup %d.\n",
|
||||
t.active, t.recover, t.setup);
|
||||
if (t.recover > 16) {
|
||||
t.active += t.recover - 16;
|
||||
|
@ -153,12 +153,12 @@ static int cs5520_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
/* Perform set up for DMA */
|
||||
if (pci_enable_device_io(pdev)) {
|
||||
printk(KERN_ERR DRV_NAME ": unable to configure BAR2.\n");
|
||||
dev_err(&pdev->dev, "unable to configure BAR2.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) {
|
||||
printk(KERN_ERR DRV_NAME ": unable to configure DMA mask.\n");
|
||||
dev_err(&pdev->dev, "unable to configure DMA mask.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -263,12 +263,12 @@ static int cs5536_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
ppi[1] = &ata_dummy_port_info;
|
||||
|
||||
if (use_msr)
|
||||
printk(KERN_ERR DRV_NAME ": Using MSR regs instead of PCI\n");
|
||||
dev_err(&dev->dev, DRV_NAME ": Using MSR regs instead of PCI\n");
|
||||
|
||||
cs5536_read(dev, CFG, &cfg);
|
||||
|
||||
if ((cfg & IDE_CFG_CHANEN) == 0) {
|
||||
printk(KERN_ERR DRV_NAME ": disabled by BIOS\n");
|
||||
dev_err(&dev->dev, DRV_NAME ": disabled by BIOS\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -62,7 +62,7 @@ static void cy82c693_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||
u32 addr;
|
||||
|
||||
if (ata_timing_compute(adev, adev->pio_mode, &t, T, 1) < 0) {
|
||||
printk(KERN_ERR DRV_NAME ": mome computation failed.\n");
|
||||
ata_dev_err(adev, DRV_NAME ": mome computation failed.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -855,7 +855,6 @@ static void ep93xx_pata_drain_fifo(struct ata_queued_cmd *qc)
|
||||
&& count < 65536; count += 2)
|
||||
ep93xx_pata_read_reg(drv_data, IDECTRL_ADDR_DATA);
|
||||
|
||||
/* Can become DEBUG later */
|
||||
if (count)
|
||||
ata_port_dbg(ap, "drained %d bytes to clear DRQ.\n", count);
|
||||
|
||||
|
@ -14,9 +14,6 @@
|
||||
* TODO
|
||||
* Look into engine reset on timeout errors. Should not be required.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
@ -183,7 +180,7 @@ static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr,
|
||||
|
||||
i = match_string(list, -1, model_num);
|
||||
if (i >= 0) {
|
||||
pr_warn("%s is not supported for %s\n", modestr, list[i]);
|
||||
ata_dev_warn(dev, "%s is not supported for %s\n", modestr, list[i]);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -14,9 +14,6 @@
|
||||
* TODO
|
||||
* Look into engine reset on timeout errors. Should not be required.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
@ -231,7 +228,8 @@ static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr,
|
||||
|
||||
i = match_string(list, -1, model_num);
|
||||
if (i >= 0) {
|
||||
pr_warn("%s is not supported for %s\n", modestr, list[i]);
|
||||
ata_dev_warn(dev, "%s is not supported for %s\n",
|
||||
modestr, list[i]);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@ -864,7 +862,8 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
chip_table = &hpt372;
|
||||
break;
|
||||
default:
|
||||
pr_err("Unknown HPT366 subtype, please report (%d)\n",
|
||||
dev_err(&dev->dev,
|
||||
"Unknown HPT366 subtype, please report (%d)\n",
|
||||
rev);
|
||||
return -ENODEV;
|
||||
}
|
||||
@ -905,7 +904,8 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
*ppi = &info_hpt374_fn1;
|
||||
break;
|
||||
default:
|
||||
pr_err("PCI table is bogus, please report (%d)\n", dev->device);
|
||||
dev_err(&dev->dev, "PCI table is bogus, please report (%d)\n",
|
||||
dev->device);
|
||||
return -ENODEV;
|
||||
}
|
||||
/* Ok so this is a chip we support */
|
||||
@ -953,7 +953,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
u8 sr;
|
||||
u32 total = 0;
|
||||
|
||||
pr_warn("BIOS has not set timing clocks\n");
|
||||
dev_warn(&dev->dev, "BIOS has not set timing clocks\n");
|
||||
|
||||
/* This is the process the HPT371 BIOS is reported to use */
|
||||
for (i = 0; i < 128; i++) {
|
||||
@ -1009,7 +1009,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
(f_high << 16) | f_low | 0x100);
|
||||
}
|
||||
if (adjust == 8) {
|
||||
pr_err("DPLL did not stabilize!\n");
|
||||
dev_err(&dev->dev, "DPLL did not stabilize!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
if (dpll == 3)
|
||||
@ -1017,7 +1017,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
else
|
||||
private_data = (void *)hpt37x_timings_50;
|
||||
|
||||
pr_info("bus clock %dMHz, using %dMHz DPLL\n",
|
||||
dev_info(&dev->dev, "bus clock %dMHz, using %dMHz DPLL\n",
|
||||
MHz[clock_slot], MHz[dpll]);
|
||||
} else {
|
||||
private_data = (void *)chip_table->clocks[clock_slot];
|
||||
@ -1032,7 +1032,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
if (clock_slot < 2 && ppi[0] == &info_hpt370a)
|
||||
ppi[0] = &info_hpt370a_33;
|
||||
|
||||
pr_info("%s using %dMHz bus clock\n",
|
||||
dev_info(&dev->dev, "%s using %dMHz bus clock\n",
|
||||
chip_table->name, MHz[clock_slot]);
|
||||
}
|
||||
|
||||
|
@ -15,9 +15,6 @@
|
||||
* TODO
|
||||
* Work out best PLL policy
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
@ -420,7 +417,7 @@ static int hpt3x2n_pci_clock(struct pci_dev *pdev)
|
||||
u16 sr;
|
||||
u32 total = 0;
|
||||
|
||||
pr_warn("BIOS clock data not set\n");
|
||||
dev_warn(&pdev->dev, "BIOS clock data not set\n");
|
||||
|
||||
/* This is the process the HPT371 BIOS is reported to use */
|
||||
for (i = 0; i < 128; i++) {
|
||||
@ -530,7 +527,8 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
ppi[0] = &info_hpt372n;
|
||||
break;
|
||||
default:
|
||||
pr_err("PCI table is bogus, please report (%d)\n", dev->device);
|
||||
dev_err(&dev->dev,"PCI table is bogus, please report (%d)\n",
|
||||
dev->device);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -579,11 +577,11 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
pci_write_config_dword(dev, 0x5C, (f_high << 16) | f_low);
|
||||
}
|
||||
if (adjust == 8) {
|
||||
pr_err("DPLL did not stabilize!\n");
|
||||
dev_err(&dev->dev, "DPLL did not stabilize!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pr_info("bus clock %dMHz, using 66MHz DPLL\n", pci_mhz);
|
||||
dev_info(&dev->dev, "bus clock %dMHz, using 66MHz DPLL\n", pci_mhz);
|
||||
|
||||
/*
|
||||
* Set our private data up. We only need a few flags
|
||||
|
@ -431,7 +431,8 @@ static unsigned int it821x_smart_qc_issue(struct ata_queued_cmd *qc)
|
||||
case ATA_CMD_SET_FEATURES:
|
||||
return ata_bmdma_qc_issue(qc);
|
||||
}
|
||||
printk(KERN_DEBUG "it821x: can't process command 0x%02X\n", qc->tf.command);
|
||||
ata_dev_dbg(qc->dev, "it821x: can't process command 0x%02X\n",
|
||||
qc->tf.command);
|
||||
return AC_ERR_DEV;
|
||||
}
|
||||
|
||||
@ -507,12 +508,14 @@ static void it821x_dev_config(struct ata_device *adev)
|
||||
|
||||
if (strstr(model_num, "Integrated Technology Express")) {
|
||||
/* RAID mode */
|
||||
ata_dev_info(adev, "%sRAID%d volume",
|
||||
adev->id[147] ? "Bootable " : "",
|
||||
adev->id[129]);
|
||||
if (adev->id[129] != 1)
|
||||
pr_cont("(%dK stripe)", adev->id[146]);
|
||||
pr_cont("\n");
|
||||
if (adev->id[129] == 1)
|
||||
ata_dev_info(adev, "%sRAID%d volume\n",
|
||||
adev->id[147] ? "Bootable " : "",
|
||||
adev->id[129]);
|
||||
else
|
||||
ata_dev_info(adev, "%sRAID%d volume (%dK stripe)\n",
|
||||
adev->id[147] ? "Bootable " : "",
|
||||
adev->id[129], adev->id[146]);
|
||||
}
|
||||
/* This is a controller firmware triggered funny, don't
|
||||
report the drive faulty! */
|
||||
@ -534,7 +537,7 @@ static void it821x_dev_config(struct ata_device *adev)
|
||||
*/
|
||||
|
||||
static unsigned int it821x_read_id(struct ata_device *adev,
|
||||
struct ata_taskfile *tf, u16 *id)
|
||||
struct ata_taskfile *tf, __le16 *id)
|
||||
{
|
||||
unsigned int err_mask;
|
||||
unsigned char model_num[ATA_ID_PROD_LEN + 1];
|
||||
@ -542,21 +545,20 @@ static unsigned int it821x_read_id(struct ata_device *adev,
|
||||
err_mask = ata_do_dev_read_id(adev, tf, id);
|
||||
if (err_mask)
|
||||
return err_mask;
|
||||
ata_id_c_string(id, model_num, ATA_ID_PROD, sizeof(model_num));
|
||||
ata_id_c_string((u16 *)id, model_num, ATA_ID_PROD, sizeof(model_num));
|
||||
|
||||
id[83] &= ~(1 << 12); /* Cache flush is firmware handled */
|
||||
id[83] &= ~(1 << 13); /* Ditto for LBA48 flushes */
|
||||
id[84] &= ~(1 << 6); /* No FUA */
|
||||
id[85] &= ~(1 << 10); /* No HPA */
|
||||
id[76] = 0; /* No NCQ/AN etc */
|
||||
id[83] &= cpu_to_le16(~(1 << 12)); /* Cache flush is firmware handled */
|
||||
id[84] &= cpu_to_le16(~(1 << 6)); /* No FUA */
|
||||
id[85] &= cpu_to_le16(~(1 << 10)); /* No HPA */
|
||||
id[76] = 0; /* No NCQ/AN etc */
|
||||
|
||||
if (strstr(model_num, "Integrated Technology Express")) {
|
||||
/* Set feature bits the firmware neglects */
|
||||
id[49] |= 0x0300; /* LBA, DMA */
|
||||
id[83] &= 0x7FFF;
|
||||
id[83] |= 0x4400; /* Word 83 is valid and LBA48 */
|
||||
id[86] |= 0x0400; /* LBA48 on */
|
||||
id[ATA_ID_MAJOR_VER] |= 0x1F;
|
||||
id[49] |= cpu_to_le16(0x0300); /* LBA, DMA */
|
||||
id[83] &= cpu_to_le16(0x7FFF);
|
||||
id[83] |= cpu_to_le16(0x4400); /* Word 83 is valid and LBA48 */
|
||||
id[86] |= cpu_to_le16(0x0400); /* LBA48 on */
|
||||
id[ATA_ID_MAJOR_VER] |= cpu_to_le16(0x1F);
|
||||
/* Clear the serial number because it's different each boot
|
||||
which breaks validation on resume */
|
||||
memset(&id[ATA_ID_SERNO], 0x20, ATA_ID_SERNO_LEN);
|
||||
@ -593,6 +595,7 @@ static int it821x_check_atapi_dma(struct ata_queued_cmd *qc)
|
||||
|
||||
/**
|
||||
* it821x_display_disk - display disk setup
|
||||
* @ap: ATA port
|
||||
* @n: Device number
|
||||
* @buf: Buffer block from firmware
|
||||
*
|
||||
@ -600,7 +603,7 @@ static int it821x_check_atapi_dma(struct ata_queued_cmd *qc)
|
||||
* by the firmware.
|
||||
*/
|
||||
|
||||
static void it821x_display_disk(int n, u8 *buf)
|
||||
static void it821x_display_disk(struct ata_port *ap, int n, u8 *buf)
|
||||
{
|
||||
unsigned char id[41];
|
||||
int mode = 0;
|
||||
@ -633,13 +636,13 @@ static void it821x_display_disk(int n, u8 *buf)
|
||||
else
|
||||
strcpy(mbuf, "PIO");
|
||||
if (buf[52] == 4)
|
||||
printk(KERN_INFO "%d: %-6s %-8s %s %s\n",
|
||||
ata_port_info(ap, "%d: %-6s %-8s %s %s\n",
|
||||
n, mbuf, types[buf[52]], id, cbl);
|
||||
else
|
||||
printk(KERN_INFO "%d: %-6s %-8s Volume: %1d %s %s\n",
|
||||
ata_port_info(ap, "%d: %-6s %-8s Volume: %1d %s %s\n",
|
||||
n, mbuf, types[buf[52]], buf[53], id, cbl);
|
||||
if (buf[125] < 100)
|
||||
printk(KERN_INFO "%d: Rebuilding: %d%%\n", n, buf[125]);
|
||||
ata_port_info(ap, "%d: Rebuilding: %d%%\n", n, buf[125]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -676,7 +679,7 @@ static u8 *it821x_firmware_command(struct ata_port *ap, u8 cmd, int len)
|
||||
status = ioread8(ap->ioaddr.status_addr);
|
||||
if (status & ATA_ERR) {
|
||||
kfree(buf);
|
||||
printk(KERN_ERR "it821x_firmware_command: rejected\n");
|
||||
ata_port_err(ap, "%s: rejected\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
if (status & ATA_DRQ) {
|
||||
@ -686,7 +689,7 @@ static u8 *it821x_firmware_command(struct ata_port *ap, u8 cmd, int len)
|
||||
usleep_range(500, 1000);
|
||||
}
|
||||
kfree(buf);
|
||||
printk(KERN_ERR "it821x_firmware_command: timeout\n");
|
||||
ata_port_err(ap, "%s: timeout\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -709,13 +712,13 @@ static void it821x_probe_firmware(struct ata_port *ap)
|
||||
buf = it821x_firmware_command(ap, 0xFA, 512);
|
||||
|
||||
if (buf != NULL) {
|
||||
printk(KERN_INFO "pata_it821x: Firmware %02X/%02X/%02X%02X\n",
|
||||
ata_port_info(ap, "pata_it821x: Firmware %02X/%02X/%02X%02X\n",
|
||||
buf[505],
|
||||
buf[506],
|
||||
buf[507],
|
||||
buf[508]);
|
||||
for (i = 0; i < 4; i++)
|
||||
it821x_display_disk(i, buf + 128 * i);
|
||||
it821x_display_disk(ap, i, buf + 128 * i);
|
||||
kfree(buf);
|
||||
}
|
||||
}
|
||||
@ -771,7 +774,8 @@ static int it821x_port_start(struct ata_port *ap)
|
||||
itdev->timing10 = 1;
|
||||
/* Need to disable ATAPI DMA for this case */
|
||||
if (!itdev->smart)
|
||||
printk(KERN_WARNING DRV_NAME": Revision 0x10, workarounds activated.\n");
|
||||
dev_warn(&pdev->dev,
|
||||
"Revision 0x10, workarounds activated.\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -919,14 +923,14 @@ static int it821x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
} else {
|
||||
/* Force the card into bypass mode if so requested */
|
||||
if (it8212_noraid) {
|
||||
printk(KERN_INFO DRV_NAME ": forcing bypass mode.\n");
|
||||
dev_info(&pdev->dev, "forcing bypass mode.\n");
|
||||
it821x_disable_raid(pdev);
|
||||
}
|
||||
pci_read_config_byte(pdev, 0x50, &conf);
|
||||
conf &= 1;
|
||||
|
||||
printk(KERN_INFO DRV_NAME": controller in %s mode.\n",
|
||||
mode[conf]);
|
||||
dev_info(&pdev->dev, "controller in %s mode.\n", mode[conf]);
|
||||
|
||||
if (conf == 0)
|
||||
ppi[0] = &info_passthru;
|
||||
else
|
||||
|
@ -114,7 +114,7 @@ static void ixp4xx_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||
{
|
||||
struct ixp4xx_pata *ixpp = ap->host->private_data;
|
||||
|
||||
ata_dev_printk(adev, KERN_INFO, "configured for PIO%d 8bit\n",
|
||||
ata_dev_info(adev, "configured for PIO%d 8bit\n",
|
||||
adev->pio_mode - XFER_PIO_0);
|
||||
ixp4xx_set_8bit_timing(ixpp, adev->pio_mode);
|
||||
}
|
||||
@ -132,8 +132,8 @@ static unsigned int ixp4xx_mmio_data_xfer(struct ata_queued_cmd *qc,
|
||||
struct ixp4xx_pata *ixpp = ap->host->private_data;
|
||||
unsigned long flags;
|
||||
|
||||
ata_dev_printk(adev, KERN_DEBUG, "%s %d bytes\n", (rw == READ) ? "READ" : "WRITE",
|
||||
buflen);
|
||||
ata_dev_dbg(adev, "%s %d bytes\n", (rw == READ) ? "READ" : "WRITE",
|
||||
buflen);
|
||||
spin_lock_irqsave(ap->lock, flags);
|
||||
|
||||
/* set the expansion bus in 16bit mode and restore
|
||||
|
@ -32,7 +32,6 @@
|
||||
|
||||
static int marvell_pata_active(struct pci_dev *pdev)
|
||||
{
|
||||
int i;
|
||||
u32 devices;
|
||||
void __iomem *barp;
|
||||
|
||||
@ -44,11 +43,6 @@ static int marvell_pata_active(struct pci_dev *pdev)
|
||||
if (barp == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
printk("BAR5:");
|
||||
for(i = 0; i <= 0x0F; i++)
|
||||
printk("%02X:%02X ", i, ioread8(barp + i));
|
||||
printk("\n");
|
||||
|
||||
devices = ioread32(barp + 0x0C);
|
||||
pci_iounmap(pdev, barp);
|
||||
|
||||
@ -149,7 +143,8 @@ static int marvell_init_one (struct pci_dev *pdev, const struct pci_device_id *i
|
||||
|
||||
#if IS_ENABLED(CONFIG_SATA_AHCI)
|
||||
if (!marvell_pata_active(pdev)) {
|
||||
printk(KERN_INFO DRV_NAME ": PATA port not active, deferring to AHCI driver.\n");
|
||||
dev_info(&pdev->dev,
|
||||
"PATA port not active, deferring to AHCI driver.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
@ -21,12 +21,13 @@
|
||||
/* No PIO or DMA methods needed for this device */
|
||||
|
||||
static unsigned int netcell_read_id(struct ata_device *adev,
|
||||
struct ata_taskfile *tf, u16 *id)
|
||||
struct ata_taskfile *tf, __le16 *id)
|
||||
{
|
||||
unsigned int err_mask = ata_do_dev_read_id(adev, tf, id);
|
||||
|
||||
/* Firmware forgets to mark words 85-87 valid */
|
||||
if (err_mask == 0)
|
||||
id[ATA_ID_CSF_DEFAULT] |= 0x4000;
|
||||
id[ATA_ID_CSF_DEFAULT] |= cpu_to_le16(0x4000);
|
||||
return err_mask;
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
||||
#include <trace/events/libata.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/octeon/octeon.h>
|
||||
|
||||
@ -73,16 +73,12 @@ MODULE_PARM_DESC(enable_dma,
|
||||
*/
|
||||
static unsigned int ns_to_tim_reg(unsigned int tim_mult, unsigned int nsecs)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
/*
|
||||
* Compute # of eclock periods to get desired duration in
|
||||
* nanoseconds.
|
||||
*/
|
||||
val = DIV_ROUND_UP(nsecs * (octeon_get_io_clock_rate() / 1000000),
|
||||
return DIV_ROUND_UP(nsecs * (octeon_get_io_clock_rate() / 1000000),
|
||||
1000 * tim_mult);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void octeon_cf_set_boot_reg_cfg(int cs, unsigned int multiplier)
|
||||
@ -273,9 +269,9 @@ static void octeon_cf_set_dmamode(struct ata_port *ap, struct ata_device *dev)
|
||||
dma_tim.s.we_n = ns_to_tim_reg(tim_mult, oe_n);
|
||||
dma_tim.s.we_a = ns_to_tim_reg(tim_mult, oe_a);
|
||||
|
||||
pr_debug("ns to ticks (mult %d) of %d is: %d\n", tim_mult, 60,
|
||||
ata_dev_dbg(dev, "ns to ticks (mult %d) of %d is: %d\n", tim_mult, 60,
|
||||
ns_to_tim_reg(tim_mult, 60));
|
||||
pr_debug("oe_n: %d, oe_a: %d, dmack_s: %d, dmack_h: %d, dmarq: %d, pause: %d\n",
|
||||
ata_dev_dbg(dev, "oe_n: %d, oe_a: %d, dmack_s: %d, dmack_h: %d, dmarq: %d, pause: %d\n",
|
||||
dma_tim.s.oe_n, dma_tim.s.oe_a, dma_tim.s.dmack_s,
|
||||
dma_tim.s.dmack_h, dma_tim.s.dmarq, dma_tim.s.pause);
|
||||
|
||||
@ -440,7 +436,6 @@ static int octeon_cf_softreset16(struct ata_link *link, unsigned int *classes,
|
||||
int rc;
|
||||
u8 err;
|
||||
|
||||
DPRINTK("about to softreset\n");
|
||||
__raw_writew(ap->ctl, base + 0xe);
|
||||
udelay(20);
|
||||
__raw_writew(ap->ctl | ATA_SRST, base + 0xe);
|
||||
@ -455,7 +450,6 @@ static int octeon_cf_softreset16(struct ata_link *link, unsigned int *classes,
|
||||
|
||||
/* determine by signature whether we have ATA or ATAPI devices */
|
||||
classes[0] = ata_sff_dev_classify(&link->device[0], 1, &err);
|
||||
DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -479,23 +473,11 @@ static void octeon_cf_tf_load16(struct ata_port *ap,
|
||||
__raw_writew(tf->hob_feature << 8, base + 0xc);
|
||||
__raw_writew(tf->hob_nsect | tf->hob_lbal << 8, base + 2);
|
||||
__raw_writew(tf->hob_lbam | tf->hob_lbah << 8, base + 4);
|
||||
VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n",
|
||||
tf->hob_feature,
|
||||
tf->hob_nsect,
|
||||
tf->hob_lbal,
|
||||
tf->hob_lbam,
|
||||
tf->hob_lbah);
|
||||
}
|
||||
if (is_addr) {
|
||||
__raw_writew(tf->feature << 8, base + 0xc);
|
||||
__raw_writew(tf->nsect | tf->lbal << 8, base + 2);
|
||||
__raw_writew(tf->lbam | tf->lbah << 8, base + 4);
|
||||
VPRINTK("feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n",
|
||||
tf->feature,
|
||||
tf->nsect,
|
||||
tf->lbal,
|
||||
tf->lbam,
|
||||
tf->lbah);
|
||||
}
|
||||
ata_wait_idle(ap);
|
||||
}
|
||||
@ -516,20 +498,14 @@ static void octeon_cf_exec_command16(struct ata_port *ap,
|
||||
{
|
||||
/* The base of the registers is at ioaddr.data_addr. */
|
||||
void __iomem *base = ap->ioaddr.data_addr;
|
||||
u16 blob;
|
||||
u16 blob = 0;
|
||||
|
||||
if (tf->flags & ATA_TFLAG_DEVICE) {
|
||||
VPRINTK("device 0x%X\n", tf->device);
|
||||
if (tf->flags & ATA_TFLAG_DEVICE)
|
||||
blob = tf->device;
|
||||
} else {
|
||||
blob = 0;
|
||||
}
|
||||
|
||||
DPRINTK("ata%u: cmd 0x%X\n", ap->print_id, tf->command);
|
||||
blob |= (tf->command << 8);
|
||||
__raw_writew(blob, base + 6);
|
||||
|
||||
|
||||
ata_wait_idle(ap);
|
||||
}
|
||||
|
||||
@ -543,12 +519,10 @@ static void octeon_cf_dma_setup(struct ata_queued_cmd *qc)
|
||||
struct octeon_cf_port *cf_port;
|
||||
|
||||
cf_port = ap->private_data;
|
||||
DPRINTK("ENTER\n");
|
||||
/* issue r/w command */
|
||||
qc->cursg = qc->sg;
|
||||
cf_port->dma_finished = 0;
|
||||
ap->ops->sff_exec_command(ap, &qc->tf);
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -563,8 +537,6 @@ static void octeon_cf_dma_start(struct ata_queued_cmd *qc)
|
||||
union cvmx_mio_boot_dma_intx mio_boot_dma_int;
|
||||
struct scatterlist *sg;
|
||||
|
||||
VPRINTK("%d scatterlists\n", qc->n_elem);
|
||||
|
||||
/* Get the scatter list entry we need to DMA into */
|
||||
sg = qc->cursg;
|
||||
BUG_ON(!sg);
|
||||
@ -605,10 +577,6 @@ static void octeon_cf_dma_start(struct ata_queued_cmd *qc)
|
||||
|
||||
mio_boot_dma_cfg.s.adr = sg_dma_address(sg);
|
||||
|
||||
VPRINTK("%s %d bytes address=%p\n",
|
||||
(mio_boot_dma_cfg.s.rw) ? "write" : "read", sg->length,
|
||||
(void *)(unsigned long)mio_boot_dma_cfg.s.adr);
|
||||
|
||||
cvmx_write_csr(cf_port->dma_base + DMA_CFG, mio_boot_dma_cfg.u64);
|
||||
}
|
||||
|
||||
@ -627,9 +595,7 @@ static unsigned int octeon_cf_dma_finished(struct ata_port *ap,
|
||||
union cvmx_mio_boot_dma_intx dma_int;
|
||||
u8 status;
|
||||
|
||||
VPRINTK("ata%u: protocol %d task_state %d\n",
|
||||
ap->print_id, qc->tf.protocol, ap->hsm_task_state);
|
||||
|
||||
trace_ata_bmdma_stop(qc, &qc->tf, qc->tag);
|
||||
|
||||
if (ap->hsm_task_state != HSM_ST_LAST)
|
||||
return 0;
|
||||
@ -678,7 +644,6 @@ static irqreturn_t octeon_cf_interrupt(int irq, void *dev_instance)
|
||||
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
for (i = 0; i < host->n_ports; i++) {
|
||||
u8 status;
|
||||
struct ata_port *ap;
|
||||
@ -701,6 +666,7 @@ static irqreturn_t octeon_cf_interrupt(int irq, void *dev_instance)
|
||||
if (!sg_is_last(qc->cursg)) {
|
||||
qc->cursg = sg_next(qc->cursg);
|
||||
handled = 1;
|
||||
trace_ata_bmdma_start(ap, &qc->tf, qc->tag);
|
||||
octeon_cf_dma_start(qc);
|
||||
continue;
|
||||
} else {
|
||||
@ -732,7 +698,6 @@ static irqreturn_t octeon_cf_interrupt(int irq, void *dev_instance)
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
DPRINTK("EXIT\n");
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
|
||||
@ -800,8 +765,11 @@ static unsigned int octeon_cf_qc_issue(struct ata_queued_cmd *qc)
|
||||
case ATA_PROT_DMA:
|
||||
WARN_ON(qc->tf.flags & ATA_TFLAG_POLLING);
|
||||
|
||||
trace_ata_tf_load(ap, &qc->tf);
|
||||
ap->ops->sff_tf_load(ap, &qc->tf); /* load tf registers */
|
||||
trace_ata_bmdma_setup(ap, &qc->tf, qc->tag);
|
||||
octeon_cf_dma_setup(qc); /* set up dma */
|
||||
trace_ata_bmdma_start(ap, &qc->tf, qc->tag);
|
||||
octeon_cf_dma_start(qc); /* initiate dma */
|
||||
ap->hsm_task_state = HSM_ST_LAST;
|
||||
break;
|
||||
|
@ -25,11 +25,12 @@ static int pata_of_platform_probe(struct platform_device *ofdev)
|
||||
struct device_node *dn = ofdev->dev.of_node;
|
||||
struct resource io_res;
|
||||
struct resource ctl_res;
|
||||
struct resource *irq_res;
|
||||
struct resource irq_res;
|
||||
unsigned int reg_shift = 0;
|
||||
int pio_mode = 0;
|
||||
int pio_mask;
|
||||
bool use16bit;
|
||||
int irq;
|
||||
|
||||
ret = of_address_to_resource(dn, 0, &io_res);
|
||||
if (ret) {
|
||||
@ -45,7 +46,15 @@ static int pata_of_platform_probe(struct platform_device *ofdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
irq_res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0);
|
||||
memset(&irq_res, 0, sizeof(irq_res));
|
||||
|
||||
irq = platform_get_irq_optional(ofdev, 0);
|
||||
if (irq < 0 && irq != -ENXIO)
|
||||
return irq;
|
||||
if (irq > 0) {
|
||||
irq_res.start = irq;
|
||||
irq_res.end = irq;
|
||||
}
|
||||
|
||||
of_property_read_u32(dn, "reg-shift", ®_shift);
|
||||
|
||||
@ -63,7 +72,7 @@ static int pata_of_platform_probe(struct platform_device *ofdev)
|
||||
pio_mask = 1 << pio_mode;
|
||||
pio_mask |= (1 << pio_mode) - 1;
|
||||
|
||||
return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, irq_res,
|
||||
return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, irq > 0 ? &irq_res : NULL,
|
||||
reg_shift, pio_mask, &pata_platform_sht,
|
||||
use16bit);
|
||||
}
|
||||
|
@ -30,13 +30,6 @@
|
||||
|
||||
#define DRV_NAME "pata_pdc2027x"
|
||||
#define DRV_VERSION "1.0"
|
||||
#undef PDC_DEBUG
|
||||
|
||||
#ifdef PDC_DEBUG
|
||||
#define PDPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ## args)
|
||||
#else
|
||||
#define PDPRINTK(fmt, args...)
|
||||
#endif
|
||||
|
||||
enum {
|
||||
PDC_MMIO_BAR = 5,
|
||||
@ -214,11 +207,11 @@ static int pdc2027x_cable_detect(struct ata_port *ap)
|
||||
if (cgcr & (1 << 26))
|
||||
goto cbl40;
|
||||
|
||||
PDPRINTK("No cable or 80-conductor cable on port %d\n", ap->port_no);
|
||||
ata_port_dbg(ap, "No cable or 80-conductor cable\n");
|
||||
|
||||
return ATA_CBL_PATA80;
|
||||
cbl40:
|
||||
printk(KERN_INFO DRV_NAME ": 40-conductor cable detected on port %d\n", ap->port_no);
|
||||
ata_port_info(ap, DRV_NAME ":40-conductor cable detected\n");
|
||||
return ATA_CBL_PATA40;
|
||||
}
|
||||
|
||||
@ -292,17 +285,17 @@ static void pdc2027x_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||
unsigned int pio = adev->pio_mode - XFER_PIO_0;
|
||||
u32 ctcr0, ctcr1;
|
||||
|
||||
PDPRINTK("adev->pio_mode[%X]\n", adev->pio_mode);
|
||||
ata_port_dbg(ap, "adev->pio_mode[%X]\n", adev->pio_mode);
|
||||
|
||||
/* Sanity check */
|
||||
if (pio > 4) {
|
||||
printk(KERN_ERR DRV_NAME ": Unknown pio mode [%d] ignored\n", pio);
|
||||
ata_port_err(ap, "Unknown pio mode [%d] ignored\n", pio);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
/* Set the PIO timing registers using value table for 133MHz */
|
||||
PDPRINTK("Set pio regs... \n");
|
||||
ata_port_dbg(ap, "Set pio regs... \n");
|
||||
|
||||
ctcr0 = ioread32(dev_mmio(ap, adev, PDC_CTCR0));
|
||||
ctcr0 &= 0xffff0000;
|
||||
@ -315,9 +308,7 @@ static void pdc2027x_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
||||
ctcr1 |= (pdc2027x_pio_timing_tbl[pio].value2 << 24);
|
||||
iowrite32(ctcr1, dev_mmio(ap, adev, PDC_CTCR1));
|
||||
|
||||
PDPRINTK("Set pio regs done\n");
|
||||
|
||||
PDPRINTK("Set to pio mode[%u] \n", pio);
|
||||
ata_port_dbg(ap, "Set to pio mode[%u] \n", pio);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -350,7 +341,7 @@ static void pdc2027x_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
||||
iowrite32(ctcr1 & ~(1 << 7), dev_mmio(ap, adev, PDC_CTCR1));
|
||||
}
|
||||
|
||||
PDPRINTK("Set udma regs... \n");
|
||||
ata_port_dbg(ap, "Set udma regs... \n");
|
||||
|
||||
ctcr1 = ioread32(dev_mmio(ap, adev, PDC_CTCR1));
|
||||
ctcr1 &= 0xff000000;
|
||||
@ -359,16 +350,14 @@ static void pdc2027x_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
||||
(pdc2027x_udma_timing_tbl[udma_mode].value2 << 16);
|
||||
iowrite32(ctcr1, dev_mmio(ap, adev, PDC_CTCR1));
|
||||
|
||||
PDPRINTK("Set udma regs done\n");
|
||||
|
||||
PDPRINTK("Set to udma mode[%u] \n", udma_mode);
|
||||
ata_port_dbg(ap, "Set to udma mode[%u] \n", udma_mode);
|
||||
|
||||
} else if ((dma_mode >= XFER_MW_DMA_0) &&
|
||||
(dma_mode <= XFER_MW_DMA_2)) {
|
||||
/* Set the MDMA timing registers with value table for 133MHz */
|
||||
unsigned int mdma_mode = dma_mode & 0x07;
|
||||
|
||||
PDPRINTK("Set mdma regs... \n");
|
||||
ata_port_dbg(ap, "Set mdma regs... \n");
|
||||
ctcr0 = ioread32(dev_mmio(ap, adev, PDC_CTCR0));
|
||||
|
||||
ctcr0 &= 0x0000ffff;
|
||||
@ -376,11 +365,10 @@ static void pdc2027x_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
||||
(pdc2027x_mdma_timing_tbl[mdma_mode].value1 << 24);
|
||||
|
||||
iowrite32(ctcr0, dev_mmio(ap, adev, PDC_CTCR0));
|
||||
PDPRINTK("Set mdma regs done\n");
|
||||
|
||||
PDPRINTK("Set to mdma mode[%u] \n", mdma_mode);
|
||||
ata_port_dbg(ap, "Set to mdma mode[%u] \n", mdma_mode);
|
||||
} else {
|
||||
printk(KERN_ERR DRV_NAME ": Unknown dma mode [%u] ignored\n", dma_mode);
|
||||
ata_port_err(ap, "Unknown dma mode [%u] ignored\n", dma_mode);
|
||||
}
|
||||
}
|
||||
|
||||
@ -414,7 +402,7 @@ static int pdc2027x_set_mode(struct ata_link *link, struct ata_device **r_failed
|
||||
ctcr1 |= (1 << 25);
|
||||
iowrite32(ctcr1, dev_mmio(ap, dev, PDC_CTCR1));
|
||||
|
||||
PDPRINTK("Turn on prefetch\n");
|
||||
ata_dev_dbg(dev, "Turn on prefetch\n");
|
||||
} else {
|
||||
pdc2027x_set_dmamode(ap, dev);
|
||||
}
|
||||
@ -485,8 +473,8 @@ static long pdc_read_counter(struct ata_host *host)
|
||||
|
||||
counter = (bccrh << 15) | bccrl;
|
||||
|
||||
PDPRINTK("bccrh [%X] bccrl [%X]\n", bccrh, bccrl);
|
||||
PDPRINTK("bccrhv[%X] bccrlv[%X]\n", bccrhv, bccrlv);
|
||||
dev_dbg(host->dev, "bccrh [%X] bccrl [%X]\n", bccrh, bccrl);
|
||||
dev_dbg(host->dev, "bccrhv[%X] bccrlv[%X]\n", bccrhv, bccrlv);
|
||||
|
||||
/*
|
||||
* The 30-bit decreasing counter are read by 2 pieces.
|
||||
@ -495,7 +483,7 @@ static long pdc_read_counter(struct ata_host *host)
|
||||
*/
|
||||
if (retry && !(bccrh == bccrhv && bccrl >= bccrlv)) {
|
||||
retry--;
|
||||
PDPRINTK("rereading counter\n");
|
||||
dev_dbg(host->dev, "rereading counter\n");
|
||||
goto retry;
|
||||
}
|
||||
|
||||
@ -520,20 +508,19 @@ static void pdc_adjust_pll(struct ata_host *host, long pll_clock, unsigned int b
|
||||
|
||||
/* Sanity check */
|
||||
if (unlikely(pll_clock_khz < 5000L || pll_clock_khz > 70000L)) {
|
||||
printk(KERN_ERR DRV_NAME ": Invalid PLL input clock %ldkHz, give up!\n", pll_clock_khz);
|
||||
dev_err(host->dev, "Invalid PLL input clock %ldkHz, give up!\n",
|
||||
pll_clock_khz);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef PDC_DEBUG
|
||||
PDPRINTK("pout_required is %ld\n", pout_required);
|
||||
dev_dbg(host->dev, "pout_required is %ld\n", pout_required);
|
||||
|
||||
/* Show the current clock value of PLL control register
|
||||
* (maybe already configured by the firmware)
|
||||
*/
|
||||
pll_ctl = ioread16(mmio_base + PDC_PLL_CTL);
|
||||
|
||||
PDPRINTK("pll_ctl[%X]\n", pll_ctl);
|
||||
#endif
|
||||
dev_dbg(host->dev, "pll_ctl[%X]\n", pll_ctl);
|
||||
|
||||
/*
|
||||
* Calculate the ratio of F, R and OD
|
||||
@ -552,7 +539,7 @@ static void pdc_adjust_pll(struct ata_host *host, long pll_clock, unsigned int b
|
||||
R = 0x00;
|
||||
} else {
|
||||
/* Invalid ratio */
|
||||
printk(KERN_ERR DRV_NAME ": Invalid ratio %ld, give up!\n", ratio);
|
||||
dev_err(host->dev, "Invalid ratio %ld, give up!\n", ratio);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -560,15 +547,15 @@ static void pdc_adjust_pll(struct ata_host *host, long pll_clock, unsigned int b
|
||||
|
||||
if (unlikely(F < 0 || F > 127)) {
|
||||
/* Invalid F */
|
||||
printk(KERN_ERR DRV_NAME ": F[%d] invalid!\n", F);
|
||||
dev_err(host->dev, "F[%d] invalid!\n", F);
|
||||
return;
|
||||
}
|
||||
|
||||
PDPRINTK("F[%d] R[%d] ratio*1000[%ld]\n", F, R, ratio);
|
||||
dev_dbg(host->dev, "F[%d] R[%d] ratio*1000[%ld]\n", F, R, ratio);
|
||||
|
||||
pll_ctl = (R << 8) | F;
|
||||
|
||||
PDPRINTK("Writing pll_ctl[%X]\n", pll_ctl);
|
||||
dev_dbg(host->dev, "Writing pll_ctl[%X]\n", pll_ctl);
|
||||
|
||||
iowrite16(pll_ctl, mmio_base + PDC_PLL_CTL);
|
||||
ioread16(mmio_base + PDC_PLL_CTL); /* flush */
|
||||
@ -576,15 +563,13 @@ static void pdc_adjust_pll(struct ata_host *host, long pll_clock, unsigned int b
|
||||
/* Wait the PLL circuit to be stable */
|
||||
msleep(30);
|
||||
|
||||
#ifdef PDC_DEBUG
|
||||
/*
|
||||
* Show the current clock value of PLL control register
|
||||
* (maybe configured by the firmware)
|
||||
*/
|
||||
pll_ctl = ioread16(mmio_base + PDC_PLL_CTL);
|
||||
|
||||
PDPRINTK("pll_ctl[%X]\n", pll_ctl);
|
||||
#endif
|
||||
dev_dbg(host->dev, "pll_ctl[%X]\n", pll_ctl);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -605,7 +590,7 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
|
||||
|
||||
/* Start the test mode */
|
||||
scr = ioread32(mmio_base + PDC_SYS_CTL);
|
||||
PDPRINTK("scr[%X]\n", scr);
|
||||
dev_dbg(host->dev, "scr[%X]\n", scr);
|
||||
iowrite32(scr | (0x01 << 14), mmio_base + PDC_SYS_CTL);
|
||||
ioread32(mmio_base + PDC_SYS_CTL); /* flush */
|
||||
|
||||
@ -622,7 +607,7 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
|
||||
|
||||
/* Stop the test mode */
|
||||
scr = ioread32(mmio_base + PDC_SYS_CTL);
|
||||
PDPRINTK("scr[%X]\n", scr);
|
||||
dev_dbg(host->dev, "scr[%X]\n", scr);
|
||||
iowrite32(scr & ~(0x01 << 14), mmio_base + PDC_SYS_CTL);
|
||||
ioread32(mmio_base + PDC_SYS_CTL); /* flush */
|
||||
|
||||
@ -632,8 +617,8 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
|
||||
pll_clock = ((start_count - end_count) & 0x3fffffff) / 100 *
|
||||
(100000000 / usec_elapsed);
|
||||
|
||||
PDPRINTK("start[%ld] end[%ld] \n", start_count, end_count);
|
||||
PDPRINTK("PLL input clock[%ld]Hz\n", pll_clock);
|
||||
dev_dbg(host->dev, "start[%ld] end[%ld] PLL input clock[%ld]HZ\n",
|
||||
start_count, end_count, pll_clock);
|
||||
|
||||
return pll_clock;
|
||||
}
|
||||
|
@ -38,8 +38,6 @@ static int pdc2026x_cable_detect(struct ata_port *ap)
|
||||
static void pdc202xx_exec_command(struct ata_port *ap,
|
||||
const struct ata_taskfile *tf)
|
||||
{
|
||||
DPRINTK("ata%u: cmd 0x%X\n", ap->print_id, tf->command);
|
||||
|
||||
iowrite8(tf->command, ap->ioaddr.command_addr);
|
||||
ndelay(400);
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ static int rz1000_fifo_disable(struct pci_dev *pdev)
|
||||
reg &= 0xDFFF;
|
||||
if (pci_write_config_word(pdev, 0x40, reg) != 0)
|
||||
return -1;
|
||||
printk(KERN_INFO DRV_NAME ": disabled chipset readahead.\n");
|
||||
dev_info(&pdev->dev, "disabled chipset readahead.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -97,7 +97,7 @@ static int rz1000_init_one (struct pci_dev *pdev, const struct pci_device_id *en
|
||||
if (rz1000_fifo_disable(pdev) == 0)
|
||||
return ata_pci_sff_init_one(pdev, ppi, &rz1000_sht, NULL, 0);
|
||||
|
||||
printk(KERN_ERR DRV_NAME ": failed to disable read-ahead on chipset..\n");
|
||||
dev_err(&pdev->dev, "failed to disable read-ahead on chipset.\n");
|
||||
/* Not safe to use so skip */
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -286,13 +286,13 @@ static int serverworks_fixup_osb4(struct pci_dev *pdev)
|
||||
pci_read_config_dword(isa_dev, 0x64, ®);
|
||||
reg &= ~0x00002000; /* disable 600ns interrupt mask */
|
||||
if (!(reg & 0x00004000))
|
||||
printk(KERN_DEBUG DRV_NAME ": UDMA not BIOS enabled.\n");
|
||||
dev_info(&pdev->dev, "UDMA not BIOS enabled.\n");
|
||||
reg |= 0x00004000; /* enable UDMA/33 support */
|
||||
pci_write_config_dword(isa_dev, 0x64, reg);
|
||||
pci_dev_put(isa_dev);
|
||||
return 0;
|
||||
}
|
||||
printk(KERN_WARNING DRV_NAME ": Unable to find bridge.\n");
|
||||
dev_warn(&pdev->dev, "Unable to find bridge.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -212,7 +212,6 @@ static void sil680_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
||||
static void sil680_sff_exec_command(struct ata_port *ap,
|
||||
const struct ata_taskfile *tf)
|
||||
{
|
||||
DPRINTK("ata%u: cmd 0x%X\n", ap->print_id, tf->command);
|
||||
iowrite8(tf->command, ap->ioaddr.command_addr);
|
||||
ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
|
||||
}
|
||||
@ -309,17 +308,17 @@ static u8 sil680_init_chip(struct pci_dev *pdev, int *try_mmio)
|
||||
|
||||
switch (tmpbyte & 0x30) {
|
||||
case 0x00:
|
||||
printk(KERN_INFO "sil680: 100MHz clock.\n");
|
||||
dev_info(&pdev->dev, "sil680: 100MHz clock.\n");
|
||||
break;
|
||||
case 0x10:
|
||||
printk(KERN_INFO "sil680: 133MHz clock.\n");
|
||||
dev_info(&pdev->dev, "sil680: 133MHz clock.\n");
|
||||
break;
|
||||
case 0x20:
|
||||
printk(KERN_INFO "sil680: Using PCI clock.\n");
|
||||
dev_info(&pdev->dev, "sil680: Using PCI clock.\n");
|
||||
break;
|
||||
/* This last case is _NOT_ ok */
|
||||
case 0x30:
|
||||
printk(KERN_ERR "sil680: Clock disabled ?\n");
|
||||
dev_err(&pdev->dev, "sil680: Clock disabled ?\n");
|
||||
}
|
||||
return tmpbyte & 0x30;
|
||||
}
|
||||
|
@ -414,12 +414,6 @@ static void via_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||
iowrite8(tf->hob_lbal, ioaddr->lbal_addr);
|
||||
iowrite8(tf->hob_lbam, ioaddr->lbam_addr);
|
||||
iowrite8(tf->hob_lbah, ioaddr->lbah_addr);
|
||||
VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n",
|
||||
tf->hob_feature,
|
||||
tf->hob_nsect,
|
||||
tf->hob_lbal,
|
||||
tf->hob_lbam,
|
||||
tf->hob_lbah);
|
||||
}
|
||||
|
||||
if (is_addr) {
|
||||
@ -428,12 +422,6 @@ static void via_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||
iowrite8(tf->lbal, ioaddr->lbal_addr);
|
||||
iowrite8(tf->lbam, ioaddr->lbam_addr);
|
||||
iowrite8(tf->lbah, ioaddr->lbah_addr);
|
||||
VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n",
|
||||
tf->feature,
|
||||
tf->nsect,
|
||||
tf->lbal,
|
||||
tf->lbam,
|
||||
tf->lbah);
|
||||
}
|
||||
|
||||
ata_wait_idle(ap);
|
||||
|
@ -284,9 +284,6 @@ static int adma_fill_sg(struct ata_queued_cmd *qc)
|
||||
*(__le32 *)(buf + i) =
|
||||
(pFLAGS & pEND) ? 0 : cpu_to_le32(pp->pkt_dma + i + 4);
|
||||
i += 4;
|
||||
|
||||
VPRINTK("PRD[%u] = (0x%lX, 0x%X)\n", i/4,
|
||||
(unsigned long)addr, len);
|
||||
}
|
||||
|
||||
if (likely(last_buf))
|
||||
@ -302,8 +299,6 @@ static enum ata_completion_errors adma_qc_prep(struct ata_queued_cmd *qc)
|
||||
u32 pkt_dma = (u32)pp->pkt_dma;
|
||||
int i = 0;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
adma_enter_reg_mode(qc->ap);
|
||||
if (qc->tf.protocol != ATA_PROT_DMA)
|
||||
return AC_ERR_OK;
|
||||
@ -355,22 +350,6 @@ static enum ata_completion_errors adma_qc_prep(struct ata_queued_cmd *qc)
|
||||
|
||||
i = adma_fill_sg(qc);
|
||||
wmb(); /* flush PRDs and pkt to memory */
|
||||
#if 0
|
||||
/* dump out CPB + PRDs for debug */
|
||||
{
|
||||
int j, len = 0;
|
||||
static char obuf[2048];
|
||||
for (j = 0; j < i; ++j) {
|
||||
len += sprintf(obuf+len, "%02x ", buf[j]);
|
||||
if ((j & 7) == 7) {
|
||||
printk("%s\n", obuf);
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
if (len)
|
||||
printk("%s\n", obuf);
|
||||
}
|
||||
#endif
|
||||
return AC_ERR_OK;
|
||||
}
|
||||
|
||||
@ -379,8 +358,6 @@ static inline void adma_packet_start(struct ata_queued_cmd *qc)
|
||||
struct ata_port *ap = qc->ap;
|
||||
void __iomem *chan = ADMA_PORT_REGS(ap);
|
||||
|
||||
VPRINTK("ENTER, ap %p\n", ap);
|
||||
|
||||
/* fire up the ADMA engine */
|
||||
writew(aPIOMD4 | aGO, chan + ADMA_CONTROL);
|
||||
}
|
||||
@ -475,8 +452,6 @@ static inline unsigned int adma_intr_mmio(struct ata_host *host)
|
||||
u8 status = ata_sff_check_status(ap);
|
||||
if ((status & ATA_BUSY))
|
||||
continue;
|
||||
DPRINTK("ata%u: protocol %d (dev_stat 0x%X)\n",
|
||||
ap->print_id, qc->tf.protocol, status);
|
||||
|
||||
/* complete taskfile transaction */
|
||||
pp->state = adma_state_idle;
|
||||
@ -504,14 +479,10 @@ static irqreturn_t adma_intr(int irq, void *dev_instance)
|
||||
struct ata_host *host = dev_instance;
|
||||
unsigned int handled = 0;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
spin_lock(&host->lock);
|
||||
handled = adma_intr_pkt(host) | adma_intr_mmio(host);
|
||||
spin_unlock(&host->lock);
|
||||
|
||||
VPRINTK("EXIT\n");
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
|
||||
@ -547,8 +518,8 @@ static int adma_port_start(struct ata_port *ap)
|
||||
return -ENOMEM;
|
||||
/* paranoia? */
|
||||
if ((pp->pkt_dma & 7) != 0) {
|
||||
printk(KERN_ERR "bad alignment for pp->pkt_dma: %08x\n",
|
||||
(u32)pp->pkt_dma);
|
||||
ata_port_err(ap, "bad alignment for pp->pkt_dma: %08x\n",
|
||||
(u32)pp->pkt_dma);
|
||||
return -ENOMEM;
|
||||
}
|
||||
ap->private_data = pp;
|
||||
|
@ -14,15 +14,6 @@
|
||||
* COPYRIGHT (C) 2005 SYNOPSYS, INC. ALL RIGHTS RESERVED
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_SATA_DWC_DEBUG
|
||||
#define DEBUG
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SATA_DWC_VDEBUG
|
||||
#define VERBOSE_DEBUG
|
||||
#define DEBUG_NCQ
|
||||
#endif
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
@ -34,6 +25,7 @@
|
||||
#include <linux/phy/phy.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/slab.h>
|
||||
#include <trace/events/libata.h>
|
||||
|
||||
#include "libata.h"
|
||||
|
||||
@ -182,10 +174,8 @@ enum {
|
||||
* Prototypes
|
||||
*/
|
||||
static void sata_dwc_bmdma_start_by_tag(struct ata_queued_cmd *qc, u8 tag);
|
||||
static int sata_dwc_qc_complete(struct ata_port *ap, struct ata_queued_cmd *qc,
|
||||
u32 check_status);
|
||||
static void sata_dwc_dma_xfer_complete(struct ata_port *ap, u32 check_status);
|
||||
static void sata_dwc_port_stop(struct ata_port *ap);
|
||||
static int sata_dwc_qc_complete(struct ata_port *ap, struct ata_queued_cmd *qc);
|
||||
static void sata_dwc_dma_xfer_complete(struct ata_port *ap);
|
||||
static void sata_dwc_clear_dmacr(struct sata_dwc_device_port *hsdevp, u8 tag);
|
||||
|
||||
#ifdef CONFIG_SATA_DWC_OLD_DMA
|
||||
@ -215,9 +205,10 @@ static int sata_dwc_dma_get_channel_old(struct sata_dwc_device_port *hsdevp)
|
||||
{
|
||||
struct sata_dwc_device *hsdev = hsdevp->hsdev;
|
||||
struct dw_dma_slave *dws = &sata_dwc_dma_dws;
|
||||
struct device *dev = hsdev->dev;
|
||||
dma_cap_mask_t mask;
|
||||
|
||||
dws->dma_dev = hsdev->dev;
|
||||
dws->dma_dev = dev;
|
||||
|
||||
dma_cap_zero(mask);
|
||||
dma_cap_set(DMA_SLAVE, mask);
|
||||
@ -225,8 +216,7 @@ static int sata_dwc_dma_get_channel_old(struct sata_dwc_device_port *hsdevp)
|
||||
/* Acquire DMA channel */
|
||||
hsdevp->chan = dma_request_channel(mask, sata_dwc_dma_filter, hsdevp);
|
||||
if (!hsdevp->chan) {
|
||||
dev_err(hsdev->dev, "%s: dma channel unavailable\n",
|
||||
__func__);
|
||||
dev_err(dev, "%s: dma channel unavailable\n", __func__);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
@ -236,26 +226,25 @@ static int sata_dwc_dma_get_channel_old(struct sata_dwc_device_port *hsdevp)
|
||||
static int sata_dwc_dma_init_old(struct platform_device *pdev,
|
||||
struct sata_dwc_device *hsdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct resource *res;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
|
||||
hsdev->dma = devm_kzalloc(&pdev->dev, sizeof(*hsdev->dma), GFP_KERNEL);
|
||||
hsdev->dma = devm_kzalloc(dev, sizeof(*hsdev->dma), GFP_KERNEL);
|
||||
if (!hsdev->dma)
|
||||
return -ENOMEM;
|
||||
|
||||
hsdev->dma->dev = &pdev->dev;
|
||||
hsdev->dma->dev = dev;
|
||||
hsdev->dma->id = pdev->id;
|
||||
|
||||
/* Get SATA DMA interrupt number */
|
||||
hsdev->dma->irq = irq_of_parse_and_map(np, 1);
|
||||
if (hsdev->dma->irq == NO_IRQ) {
|
||||
dev_err(&pdev->dev, "no SATA DMA irq\n");
|
||||
dev_err(dev, "no SATA DMA irq\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Get physical SATA DMA register base address */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
hsdev->dma->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||
hsdev->dma->regs = devm_platform_ioremap_resource(pdev, 1);
|
||||
if (IS_ERR(hsdev->dma->regs))
|
||||
return PTR_ERR(hsdev->dma->regs);
|
||||
|
||||
@ -297,35 +286,6 @@ static const char *get_prot_descript(u8 protocol)
|
||||
}
|
||||
}
|
||||
|
||||
static const char *get_dma_dir_descript(int dma_dir)
|
||||
{
|
||||
switch ((enum dma_data_direction)dma_dir) {
|
||||
case DMA_BIDIRECTIONAL:
|
||||
return "bidirectional";
|
||||
case DMA_TO_DEVICE:
|
||||
return "to device";
|
||||
case DMA_FROM_DEVICE:
|
||||
return "from device";
|
||||
default:
|
||||
return "none";
|
||||
}
|
||||
}
|
||||
|
||||
static void sata_dwc_tf_dump(struct ata_port *ap, struct ata_taskfile *tf)
|
||||
{
|
||||
dev_vdbg(ap->dev,
|
||||
"taskfile cmd: 0x%02x protocol: %s flags: 0x%lx device: %x\n",
|
||||
tf->command, get_prot_descript(tf->protocol), tf->flags,
|
||||
tf->device);
|
||||
dev_vdbg(ap->dev,
|
||||
"feature: 0x%02x nsect: 0x%x lbal: 0x%x lbam: 0x%x lbah: 0x%x\n",
|
||||
tf->feature, tf->nsect, tf->lbal, tf->lbam, tf->lbah);
|
||||
dev_vdbg(ap->dev,
|
||||
"hob_feature: 0x%02x hob_nsect: 0x%x hob_lbal: 0x%x hob_lbam: 0x%x hob_lbah: 0x%x\n",
|
||||
tf->hob_feature, tf->hob_nsect, tf->hob_lbal, tf->hob_lbam,
|
||||
tf->hob_lbah);
|
||||
}
|
||||
|
||||
static void dma_dwc_xfer_done(void *hsdev_instance)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -355,7 +315,7 @@ static void dma_dwc_xfer_done(void *hsdev_instance)
|
||||
}
|
||||
|
||||
if ((hsdevp->dma_interrupt_count % 2) == 0)
|
||||
sata_dwc_dma_xfer_complete(ap, 1);
|
||||
sata_dwc_dma_xfer_complete(ap);
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
}
|
||||
@ -553,6 +513,7 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
|
||||
* active tag. It is the tag that matches the command about to
|
||||
* be completed.
|
||||
*/
|
||||
trace_ata_bmdma_start(ap, &qc->tf, tag);
|
||||
qc->ap->link.active_tag = tag;
|
||||
sata_dwc_bmdma_start_by_tag(qc, tag);
|
||||
|
||||
@ -586,7 +547,7 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
|
||||
|
||||
if (status & ATA_ERR) {
|
||||
dev_dbg(ap->dev, "interrupt ATA_ERR (0x%x)\n", status);
|
||||
sata_dwc_qc_complete(ap, qc, 1);
|
||||
sata_dwc_qc_complete(ap, qc);
|
||||
handled = 1;
|
||||
goto DONE;
|
||||
}
|
||||
@ -611,13 +572,13 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
|
||||
}
|
||||
|
||||
if ((hsdevp->dma_interrupt_count % 2) == 0)
|
||||
sata_dwc_dma_xfer_complete(ap, 1);
|
||||
sata_dwc_dma_xfer_complete(ap);
|
||||
} else if (ata_is_pio(qc->tf.protocol)) {
|
||||
ata_sff_hsm_move(ap, qc, status, 0);
|
||||
handled = 1;
|
||||
goto DONE;
|
||||
} else {
|
||||
if (unlikely(sata_dwc_qc_complete(ap, qc, 1)))
|
||||
if (unlikely(sata_dwc_qc_complete(ap, qc)))
|
||||
goto DRVSTILLBUSY;
|
||||
}
|
||||
|
||||
@ -677,7 +638,7 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
|
||||
if (status & ATA_ERR) {
|
||||
dev_dbg(ap->dev, "%s ATA_ERR (0x%x)\n", __func__,
|
||||
status);
|
||||
sata_dwc_qc_complete(ap, qc, 1);
|
||||
sata_dwc_qc_complete(ap, qc);
|
||||
handled = 1;
|
||||
goto DONE;
|
||||
}
|
||||
@ -692,9 +653,9 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
|
||||
dev_warn(ap->dev, "%s: DMA not pending?\n",
|
||||
__func__);
|
||||
if ((hsdevp->dma_interrupt_count % 2) == 0)
|
||||
sata_dwc_dma_xfer_complete(ap, 1);
|
||||
sata_dwc_dma_xfer_complete(ap);
|
||||
} else {
|
||||
if (unlikely(sata_dwc_qc_complete(ap, qc, 1)))
|
||||
if (unlikely(sata_dwc_qc_complete(ap, qc)))
|
||||
goto STILLBUSY;
|
||||
}
|
||||
continue;
|
||||
@ -749,7 +710,7 @@ static void sata_dwc_clear_dmacr(struct sata_dwc_device_port *hsdevp, u8 tag)
|
||||
}
|
||||
}
|
||||
|
||||
static void sata_dwc_dma_xfer_complete(struct ata_port *ap, u32 check_status)
|
||||
static void sata_dwc_dma_xfer_complete(struct ata_port *ap)
|
||||
{
|
||||
struct ata_queued_cmd *qc;
|
||||
struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
|
||||
@ -763,17 +724,6 @@ static void sata_dwc_dma_xfer_complete(struct ata_port *ap, u32 check_status)
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_NCQ
|
||||
if (tag > 0) {
|
||||
dev_info(ap->dev,
|
||||
"%s tag=%u cmd=0x%02x dma dir=%s proto=%s dmacr=0x%08x\n",
|
||||
__func__, qc->hw_tag, qc->tf.command,
|
||||
get_dma_dir_descript(qc->dma_dir),
|
||||
get_prot_descript(qc->tf.protocol),
|
||||
sata_dwc_readl(&hsdev->sata_dwc_regs->dmacr));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ata_is_dma(qc->tf.protocol)) {
|
||||
if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_NONE) {
|
||||
dev_err(ap->dev,
|
||||
@ -783,15 +733,14 @@ static void sata_dwc_dma_xfer_complete(struct ata_port *ap, u32 check_status)
|
||||
}
|
||||
|
||||
hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_NONE;
|
||||
sata_dwc_qc_complete(ap, qc, check_status);
|
||||
sata_dwc_qc_complete(ap, qc);
|
||||
ap->link.active_tag = ATA_TAG_POISON;
|
||||
} else {
|
||||
sata_dwc_qc_complete(ap, qc, check_status);
|
||||
sata_dwc_qc_complete(ap, qc);
|
||||
}
|
||||
}
|
||||
|
||||
static int sata_dwc_qc_complete(struct ata_port *ap, struct ata_queued_cmd *qc,
|
||||
u32 check_status)
|
||||
static int sata_dwc_qc_complete(struct ata_port *ap, struct ata_queued_cmd *qc)
|
||||
{
|
||||
u8 status = 0;
|
||||
u32 mask = 0x0;
|
||||
@ -799,7 +748,6 @@ static int sata_dwc_qc_complete(struct ata_port *ap, struct ata_queued_cmd *qc,
|
||||
struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
|
||||
struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
|
||||
hsdev->sactive_queued = 0;
|
||||
dev_dbg(ap->dev, "%s checkstatus? %x\n", __func__, check_status);
|
||||
|
||||
if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_TX)
|
||||
dev_err(ap->dev, "TX DMA PENDING\n");
|
||||
@ -980,9 +928,6 @@ static void sata_dwc_exec_command_by_tag(struct ata_port *ap,
|
||||
{
|
||||
struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
|
||||
|
||||
dev_dbg(ap->dev, "%s cmd(0x%02x): %s tag=%d\n", __func__, tf->command,
|
||||
ata_get_cmd_descript(tf->command), tag);
|
||||
|
||||
hsdevp->cmd_issued[tag] = cmd_issued;
|
||||
|
||||
/*
|
||||
@ -1005,12 +950,9 @@ static void sata_dwc_bmdma_setup(struct ata_queued_cmd *qc)
|
||||
{
|
||||
u8 tag = qc->hw_tag;
|
||||
|
||||
if (ata_is_ncq(qc->tf.protocol)) {
|
||||
dev_dbg(qc->ap->dev, "%s: ap->link.sactive=0x%08x tag=%d\n",
|
||||
__func__, qc->ap->link.sactive, tag);
|
||||
} else {
|
||||
if (!ata_is_ncq(qc->tf.protocol))
|
||||
tag = 0;
|
||||
}
|
||||
|
||||
sata_dwc_bmdma_setup_by_tag(qc, tag);
|
||||
}
|
||||
|
||||
@ -1037,12 +979,6 @@ static void sata_dwc_bmdma_start_by_tag(struct ata_queued_cmd *qc, u8 tag)
|
||||
start_dma = 0;
|
||||
}
|
||||
|
||||
dev_dbg(ap->dev,
|
||||
"%s qc=%p tag: %x cmd: 0x%02x dma_dir: %s start_dma? %x\n",
|
||||
__func__, qc, tag, qc->tf.command,
|
||||
get_dma_dir_descript(qc->dma_dir), start_dma);
|
||||
sata_dwc_tf_dump(ap, &qc->tf);
|
||||
|
||||
if (start_dma) {
|
||||
sata_dwc_scr_read(&ap->link, SCR_ERROR, ®);
|
||||
if (reg & SATA_DWC_SERROR_ERR_BITS) {
|
||||
@ -1067,13 +1003,9 @@ static void sata_dwc_bmdma_start(struct ata_queued_cmd *qc)
|
||||
{
|
||||
u8 tag = qc->hw_tag;
|
||||
|
||||
if (ata_is_ncq(qc->tf.protocol)) {
|
||||
dev_dbg(qc->ap->dev, "%s: ap->link.sactive=0x%08x tag=%d\n",
|
||||
__func__, qc->ap->link.sactive, tag);
|
||||
} else {
|
||||
if (!ata_is_ncq(qc->tf.protocol))
|
||||
tag = 0;
|
||||
}
|
||||
dev_dbg(qc->ap->dev, "%s\n", __func__);
|
||||
|
||||
sata_dwc_bmdma_start_by_tag(qc, tag);
|
||||
}
|
||||
|
||||
@ -1084,16 +1016,6 @@ static unsigned int sata_dwc_qc_issue(struct ata_queued_cmd *qc)
|
||||
struct ata_port *ap = qc->ap;
|
||||
struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
|
||||
|
||||
#ifdef DEBUG_NCQ
|
||||
if (qc->hw_tag > 0 || ap->link.sactive > 1)
|
||||
dev_info(ap->dev,
|
||||
"%s ap id=%d cmd(0x%02x)=%s qc tag=%d prot=%s ap active_tag=0x%08x ap sactive=0x%08x\n",
|
||||
__func__, ap->print_id, qc->tf.command,
|
||||
ata_get_cmd_descript(qc->tf.command),
|
||||
qc->hw_tag, get_prot_descript(qc->tf.protocol),
|
||||
ap->link.active_tag, ap->link.sactive);
|
||||
#endif
|
||||
|
||||
if (!ata_is_ncq(qc->tf.protocol))
|
||||
tag = 0;
|
||||
|
||||
@ -1110,11 +1032,9 @@ static unsigned int sata_dwc_qc_issue(struct ata_queued_cmd *qc)
|
||||
sactive |= (0x00000001 << tag);
|
||||
sata_dwc_scr_write(&ap->link, SCR_ACTIVE, sactive);
|
||||
|
||||
dev_dbg(qc->ap->dev,
|
||||
"%s: tag=%d ap->link.sactive = 0x%08x sactive=0x%08x\n",
|
||||
__func__, tag, qc->ap->link.sactive, sactive);
|
||||
|
||||
trace_ata_tf_load(ap, &qc->tf);
|
||||
ap->ops->sff_tf_load(ap, &qc->tf);
|
||||
trace_ata_exec_command(ap, &qc->tf, tag);
|
||||
sata_dwc_exec_command_by_tag(ap, &qc->tf, tag,
|
||||
SATA_DWC_CMD_ISSUED_PEND);
|
||||
} else {
|
||||
@ -1207,6 +1127,8 @@ static const struct ata_port_info sata_dwc_port_info[] = {
|
||||
|
||||
static int sata_dwc_probe(struct platform_device *ofdev)
|
||||
{
|
||||
struct device *dev = &ofdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct sata_dwc_device *hsdev;
|
||||
u32 idr, versionr;
|
||||
char *ver = (char *)&versionr;
|
||||
@ -1216,23 +1138,21 @@ static int sata_dwc_probe(struct platform_device *ofdev)
|
||||
struct ata_host *host;
|
||||
struct ata_port_info pi = sata_dwc_port_info[0];
|
||||
const struct ata_port_info *ppi[] = { &pi, NULL };
|
||||
struct device_node *np = ofdev->dev.of_node;
|
||||
struct resource *res;
|
||||
|
||||
/* Allocate DWC SATA device */
|
||||
host = ata_host_alloc_pinfo(&ofdev->dev, ppi, SATA_DWC_MAX_PORTS);
|
||||
hsdev = devm_kzalloc(&ofdev->dev, sizeof(*hsdev), GFP_KERNEL);
|
||||
host = ata_host_alloc_pinfo(dev, ppi, SATA_DWC_MAX_PORTS);
|
||||
hsdev = devm_kzalloc(dev, sizeof(*hsdev), GFP_KERNEL);
|
||||
if (!host || !hsdev)
|
||||
return -ENOMEM;
|
||||
|
||||
host->private_data = hsdev;
|
||||
|
||||
/* Ioremap SATA registers */
|
||||
res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
|
||||
base = devm_ioremap_resource(&ofdev->dev, res);
|
||||
base = devm_platform_get_and_ioremap_resource(ofdev, 0, &res);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
dev_dbg(&ofdev->dev, "ioremap done for SATA register address\n");
|
||||
dev_dbg(dev, "ioremap done for SATA register address\n");
|
||||
|
||||
/* Synopsys DWC SATA specific Registers */
|
||||
hsdev->sata_dwc_regs = base + SATA_DWC_REG_OFFSET;
|
||||
@ -1246,11 +1166,10 @@ static int sata_dwc_probe(struct platform_device *ofdev)
|
||||
/* Read the ID and Version Registers */
|
||||
idr = sata_dwc_readl(&hsdev->sata_dwc_regs->idr);
|
||||
versionr = sata_dwc_readl(&hsdev->sata_dwc_regs->versionr);
|
||||
dev_notice(&ofdev->dev, "id %d, controller version %c.%c%c\n",
|
||||
idr, ver[0], ver[1], ver[2]);
|
||||
dev_notice(dev, "id %d, controller version %c.%c%c\n", idr, ver[0], ver[1], ver[2]);
|
||||
|
||||
/* Save dev for later use in dev_xxx() routines */
|
||||
hsdev->dev = &ofdev->dev;
|
||||
hsdev->dev = dev;
|
||||
|
||||
/* Enable SATA Interrupts */
|
||||
sata_dwc_enable_interrupts(hsdev);
|
||||
@ -1258,7 +1177,7 @@ static int sata_dwc_probe(struct platform_device *ofdev)
|
||||
/* Get SATA interrupt number */
|
||||
irq = irq_of_parse_and_map(np, 0);
|
||||
if (irq == NO_IRQ) {
|
||||
dev_err(&ofdev->dev, "no SATA DMA irq\n");
|
||||
dev_err(dev, "no SATA DMA irq\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -1270,7 +1189,7 @@ static int sata_dwc_probe(struct platform_device *ofdev)
|
||||
}
|
||||
#endif
|
||||
|
||||
hsdev->phy = devm_phy_optional_get(hsdev->dev, "sata-phy");
|
||||
hsdev->phy = devm_phy_optional_get(dev, "sata-phy");
|
||||
if (IS_ERR(hsdev->phy))
|
||||
return PTR_ERR(hsdev->phy);
|
||||
|
||||
@ -1285,7 +1204,7 @@ static int sata_dwc_probe(struct platform_device *ofdev)
|
||||
*/
|
||||
err = ata_host_activate(host, irq, sata_dwc_isr, 0, &sata_dwc_sht);
|
||||
if (err)
|
||||
dev_err(&ofdev->dev, "failed to activate host");
|
||||
dev_err(dev, "failed to activate host");
|
||||
|
||||
return 0;
|
||||
|
||||
@ -1309,7 +1228,7 @@ static int sata_dwc_remove(struct platform_device *ofdev)
|
||||
sata_dwc_dma_exit_old(hsdev);
|
||||
#endif
|
||||
|
||||
dev_dbg(&ofdev->dev, "done\n");
|
||||
dev_dbg(dev, "done\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -221,10 +221,10 @@ enum {
|
||||
* 4 Dwords per command slot, command header size == 64 Dwords.
|
||||
*/
|
||||
struct cmdhdr_tbl_entry {
|
||||
u32 cda;
|
||||
u32 prde_fis_len;
|
||||
u32 ttl;
|
||||
u32 desc_info;
|
||||
__le32 cda;
|
||||
__le32 prde_fis_len;
|
||||
__le32 ttl;
|
||||
__le32 desc_info;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -246,8 +246,10 @@ enum {
|
||||
struct command_desc {
|
||||
u8 cfis[8 * 4];
|
||||
u8 sfis[8 * 4];
|
||||
u8 acmd[4 * 4];
|
||||
u8 fill[4 * 4];
|
||||
struct_group(cdb,
|
||||
u8 acmd[4 * 4];
|
||||
u8 fill[4 * 4];
|
||||
);
|
||||
u32 prdt[SATA_FSL_MAX_PRD_DIRECT * 4];
|
||||
u32 prdt_indirect[(SATA_FSL_MAX_PRD - SATA_FSL_MAX_PRD_DIRECT) * 4];
|
||||
};
|
||||
@ -257,9 +259,9 @@ struct command_desc {
|
||||
*/
|
||||
|
||||
struct prde {
|
||||
u32 dba;
|
||||
__le32 dba;
|
||||
u8 fill[2 * 4];
|
||||
u32 ddc_and_ext;
|
||||
__le32 ddc_and_ext;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -311,16 +313,16 @@ static void fsl_sata_set_irq_coalescing(struct ata_host *host,
|
||||
intr_coalescing_ticks = ticks;
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
|
||||
DPRINTK("interrupt coalescing, count = 0x%x, ticks = %x\n",
|
||||
intr_coalescing_count, intr_coalescing_ticks);
|
||||
DPRINTK("ICC register status: (hcr base: %p) = 0x%x\n",
|
||||
hcr_base, ioread32(hcr_base + ICC));
|
||||
dev_dbg(host->dev, "interrupt coalescing, count = 0x%x, ticks = %x\n",
|
||||
intr_coalescing_count, intr_coalescing_ticks);
|
||||
dev_dbg(host->dev, "ICC register status: (hcr base: 0x%p) = 0x%x\n",
|
||||
hcr_base, ioread32(hcr_base + ICC));
|
||||
}
|
||||
|
||||
static ssize_t fsl_sata_intr_coalescing_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d %d\n",
|
||||
return sysfs_emit(buf, "%d %d\n",
|
||||
intr_coalescing_count, intr_coalescing_ticks);
|
||||
}
|
||||
|
||||
@ -355,9 +357,9 @@ static ssize_t fsl_sata_rx_watermark_show(struct device *dev,
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
rx_watermark = ioread32(csr_base + TRANSCFG);
|
||||
rx_watermark &= 0x1f;
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
return sprintf(buf, "%d\n", rx_watermark);
|
||||
|
||||
return sysfs_emit(buf, "%d\n", rx_watermark);
|
||||
}
|
||||
|
||||
static ssize_t fsl_sata_rx_watermark_store(struct device *dev,
|
||||
@ -385,25 +387,27 @@ static ssize_t fsl_sata_rx_watermark_store(struct device *dev,
|
||||
return strlen(buf);
|
||||
}
|
||||
|
||||
static inline unsigned int sata_fsl_tag(unsigned int tag,
|
||||
static inline unsigned int sata_fsl_tag(struct ata_port *ap,
|
||||
unsigned int tag,
|
||||
void __iomem *hcr_base)
|
||||
{
|
||||
/* We let libATA core do actual (queue) tag allocation */
|
||||
|
||||
if (unlikely(tag >= SATA_FSL_QUEUE_DEPTH)) {
|
||||
DPRINTK("tag %d invalid : out of range\n", tag);
|
||||
ata_port_dbg(ap, "tag %d invalid : out of range\n", tag);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (unlikely((ioread32(hcr_base + CQ)) & (1 << tag))) {
|
||||
DPRINTK("tag %d invalid : in use!!\n", tag);
|
||||
ata_port_dbg(ap, "tag %d invalid : in use!!\n", tag);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
static void sata_fsl_setup_cmd_hdr_entry(struct sata_fsl_port_priv *pp,
|
||||
static void sata_fsl_setup_cmd_hdr_entry(struct ata_port *ap,
|
||||
struct sata_fsl_port_priv *pp,
|
||||
unsigned int tag, u32 desc_info,
|
||||
u32 data_xfer_len, u8 num_prde,
|
||||
u8 fis_len)
|
||||
@ -421,11 +425,11 @@ static void sata_fsl_setup_cmd_hdr_entry(struct sata_fsl_port_priv *pp,
|
||||
pp->cmdslot[tag].ttl = cpu_to_le32(data_xfer_len & ~0x03);
|
||||
pp->cmdslot[tag].desc_info = cpu_to_le32(desc_info | (tag & 0x1F));
|
||||
|
||||
VPRINTK("cda=0x%x, prde_fis_len=0x%x, ttl=0x%x, di=0x%x\n",
|
||||
pp->cmdslot[tag].cda,
|
||||
pp->cmdslot[tag].prde_fis_len,
|
||||
pp->cmdslot[tag].ttl, pp->cmdslot[tag].desc_info);
|
||||
|
||||
ata_port_dbg(ap, "cda=0x%x, prde_fis_len=0x%x, ttl=0x%x, di=0x%x\n",
|
||||
le32_to_cpu(pp->cmdslot[tag].cda),
|
||||
le32_to_cpu(pp->cmdslot[tag].prde_fis_len),
|
||||
le32_to_cpu(pp->cmdslot[tag].ttl),
|
||||
le32_to_cpu(pp->cmdslot[tag].desc_info));
|
||||
}
|
||||
|
||||
static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc,
|
||||
@ -447,8 +451,6 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc,
|
||||
dma_addr_t indirect_ext_segment_paddr;
|
||||
unsigned int si;
|
||||
|
||||
VPRINTK("SATA FSL : cd = 0x%p, prd = 0x%p\n", cmd_desc, prd);
|
||||
|
||||
indirect_ext_segment_paddr = cmd_desc_paddr +
|
||||
SATA_FSL_CMD_DESC_OFFSET_TO_PRDT + SATA_FSL_MAX_PRD_DIRECT * 16;
|
||||
|
||||
@ -456,9 +458,6 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc,
|
||||
dma_addr_t sg_addr = sg_dma_address(sg);
|
||||
u32 sg_len = sg_dma_len(sg);
|
||||
|
||||
VPRINTK("SATA FSL : fill_sg, sg_addr = 0x%llx, sg_len = %d\n",
|
||||
(unsigned long long)sg_addr, sg_len);
|
||||
|
||||
/* warn if each s/g element is not dword aligned */
|
||||
if (unlikely(sg_addr & 0x03))
|
||||
ata_port_err(qc->ap, "s/g addr unaligned : 0x%llx\n",
|
||||
@ -469,7 +468,6 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc,
|
||||
|
||||
if (num_prde == (SATA_FSL_MAX_PRD_DIRECT - 1) &&
|
||||
sg_next(sg) != NULL) {
|
||||
VPRINTK("setting indirect prde\n");
|
||||
prd_ptr_to_indirect_ext = prd;
|
||||
prd->dba = cpu_to_le32(indirect_ext_segment_paddr);
|
||||
indirect_ext_segment_sz = 0;
|
||||
@ -481,9 +479,6 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc,
|
||||
prd->dba = cpu_to_le32(sg_addr);
|
||||
prd->ddc_and_ext = cpu_to_le32(data_snoop | (sg_len & ~0x03));
|
||||
|
||||
VPRINTK("sg_fill, ttl=%d, dba=0x%x, ddc=0x%x\n",
|
||||
ttl_dwords, prd->dba, prd->ddc_and_ext);
|
||||
|
||||
++num_prde;
|
||||
++prd;
|
||||
if (prd_ptr_to_indirect_ext)
|
||||
@ -508,7 +503,7 @@ static enum ata_completion_errors sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
||||
struct sata_fsl_port_priv *pp = ap->private_data;
|
||||
struct sata_fsl_host_priv *host_priv = ap->host->private_data;
|
||||
void __iomem *hcr_base = host_priv->hcr_base;
|
||||
unsigned int tag = sata_fsl_tag(qc->hw_tag, hcr_base);
|
||||
unsigned int tag = sata_fsl_tag(ap, qc->hw_tag, hcr_base);
|
||||
struct command_desc *cd;
|
||||
u32 desc_info = CMD_DESC_RES | CMD_DESC_SNOOP_ENABLE;
|
||||
u32 num_prde = 0;
|
||||
@ -520,19 +515,11 @@ static enum ata_completion_errors sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
||||
|
||||
ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, (u8 *) &cd->cfis);
|
||||
|
||||
VPRINTK("Dumping cfis : 0x%x, 0x%x, 0x%x\n",
|
||||
cd->cfis[0], cd->cfis[1], cd->cfis[2]);
|
||||
|
||||
if (qc->tf.protocol == ATA_PROT_NCQ) {
|
||||
VPRINTK("FPDMA xfer,Sctor cnt[0:7],[8:15] = %d,%d\n",
|
||||
cd->cfis[3], cd->cfis[11]);
|
||||
}
|
||||
|
||||
/* setup "ACMD - atapi command" in cmd. desc. if this is ATAPI cmd */
|
||||
if (ata_is_atapi(qc->tf.protocol)) {
|
||||
desc_info |= ATAPI_CMD;
|
||||
memset((void *)&cd->acmd, 0, 32);
|
||||
memcpy((void *)&cd->acmd, qc->cdb, qc->dev->cdb_len);
|
||||
memset(&cd->cdb, 0, sizeof(cd->cdb));
|
||||
memcpy(&cd->cdb, qc->cdb, qc->dev->cdb_len);
|
||||
}
|
||||
|
||||
if (qc->flags & ATA_QCFLAG_DMAMAP)
|
||||
@ -543,10 +530,10 @@ static enum ata_completion_errors sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
||||
if (qc->tf.protocol == ATA_PROT_NCQ)
|
||||
desc_info |= FPDMA_QUEUED_CMD;
|
||||
|
||||
sata_fsl_setup_cmd_hdr_entry(pp, tag, desc_info, ttl_dwords,
|
||||
sata_fsl_setup_cmd_hdr_entry(ap, pp, tag, desc_info, ttl_dwords,
|
||||
num_prde, 5);
|
||||
|
||||
VPRINTK("SATA FSL : xx_qc_prep, di = 0x%x, ttl = %d, num_prde = %d\n",
|
||||
ata_port_dbg(ap, "SATA FSL : di = 0x%x, ttl = %d, num_prde = %d\n",
|
||||
desc_info, ttl_dwords, num_prde);
|
||||
|
||||
return AC_ERR_OK;
|
||||
@ -557,9 +544,9 @@ static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc)
|
||||
struct ata_port *ap = qc->ap;
|
||||
struct sata_fsl_host_priv *host_priv = ap->host->private_data;
|
||||
void __iomem *hcr_base = host_priv->hcr_base;
|
||||
unsigned int tag = sata_fsl_tag(qc->hw_tag, hcr_base);
|
||||
unsigned int tag = sata_fsl_tag(ap, qc->hw_tag, hcr_base);
|
||||
|
||||
VPRINTK("xx_qc_issue called,CQ=0x%x,CA=0x%x,CE=0x%x,CC=0x%x\n",
|
||||
ata_port_dbg(ap, "CQ=0x%x,CA=0x%x,CE=0x%x,CC=0x%x\n",
|
||||
ioread32(CQ + hcr_base),
|
||||
ioread32(CA + hcr_base),
|
||||
ioread32(CE + hcr_base), ioread32(CC + hcr_base));
|
||||
@ -569,10 +556,10 @@ static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc)
|
||||
/* Simply queue command to the controller/device */
|
||||
iowrite32(1 << tag, CQ + hcr_base);
|
||||
|
||||
VPRINTK("xx_qc_issue called, tag=%d, CQ=0x%x, CA=0x%x\n",
|
||||
ata_port_dbg(ap, "tag=%d, CQ=0x%x, CA=0x%x\n",
|
||||
tag, ioread32(CQ + hcr_base), ioread32(CA + hcr_base));
|
||||
|
||||
VPRINTK("CE=0x%x, DE=0x%x, CC=0x%x, CmdStat = 0x%x\n",
|
||||
ata_port_dbg(ap, "CE=0x%x, DE=0x%x, CC=0x%x, CmdStat = 0x%x\n",
|
||||
ioread32(CE + hcr_base),
|
||||
ioread32(DE + hcr_base),
|
||||
ioread32(CC + hcr_base),
|
||||
@ -586,7 +573,7 @@ static bool sata_fsl_qc_fill_rtf(struct ata_queued_cmd *qc)
|
||||
struct sata_fsl_port_priv *pp = qc->ap->private_data;
|
||||
struct sata_fsl_host_priv *host_priv = qc->ap->host->private_data;
|
||||
void __iomem *hcr_base = host_priv->hcr_base;
|
||||
unsigned int tag = sata_fsl_tag(qc->hw_tag, hcr_base);
|
||||
unsigned int tag = sata_fsl_tag(qc->ap, qc->hw_tag, hcr_base);
|
||||
struct command_desc *cd;
|
||||
|
||||
cd = pp->cmdentry + tag;
|
||||
@ -613,7 +600,7 @@ static int sata_fsl_scr_write(struct ata_link *link,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
VPRINTK("xx_scr_write, reg_in = %d\n", sc_reg);
|
||||
ata_link_dbg(link, "reg_in = %d\n", sc_reg);
|
||||
|
||||
iowrite32(val, ssr_base + (sc_reg * 4));
|
||||
return 0;
|
||||
@ -637,7 +624,7 @@ static int sata_fsl_scr_read(struct ata_link *link,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
VPRINTK("xx_scr_read, reg_in = %d\n", sc_reg);
|
||||
ata_link_dbg(link, "reg_in = %d\n", sc_reg);
|
||||
|
||||
*val = ioread32(ssr_base + (sc_reg * 4));
|
||||
return 0;
|
||||
@ -649,18 +636,18 @@ static void sata_fsl_freeze(struct ata_port *ap)
|
||||
void __iomem *hcr_base = host_priv->hcr_base;
|
||||
u32 temp;
|
||||
|
||||
VPRINTK("xx_freeze, CQ=0x%x, CA=0x%x, CE=0x%x, DE=0x%x\n",
|
||||
ata_port_dbg(ap, "CQ=0x%x, CA=0x%x, CE=0x%x, DE=0x%x\n",
|
||||
ioread32(CQ + hcr_base),
|
||||
ioread32(CA + hcr_base),
|
||||
ioread32(CE + hcr_base), ioread32(DE + hcr_base));
|
||||
VPRINTK("CmdStat = 0x%x\n",
|
||||
ata_port_dbg(ap, "CmdStat = 0x%x\n",
|
||||
ioread32(host_priv->csr_base + COMMANDSTAT));
|
||||
|
||||
/* disable interrupts on the controller/port */
|
||||
temp = ioread32(hcr_base + HCONTROL);
|
||||
iowrite32((temp & ~0x3F), hcr_base + HCONTROL);
|
||||
|
||||
VPRINTK("in xx_freeze : HControl = 0x%x, HStatus = 0x%x\n",
|
||||
ata_port_dbg(ap, "HControl = 0x%x, HStatus = 0x%x\n",
|
||||
ioread32(hcr_base + HCONTROL), ioread32(hcr_base + HSTATUS));
|
||||
}
|
||||
|
||||
@ -673,7 +660,7 @@ static void sata_fsl_thaw(struct ata_port *ap)
|
||||
/* ack. any pending IRQs for this controller/port */
|
||||
temp = ioread32(hcr_base + HSTATUS);
|
||||
|
||||
VPRINTK("xx_thaw, pending IRQs = 0x%x\n", (temp & 0x3F));
|
||||
ata_port_dbg(ap, "pending IRQs = 0x%x\n", (temp & 0x3F));
|
||||
|
||||
if (temp & 0x3F)
|
||||
iowrite32((temp & 0x3F), hcr_base + HSTATUS);
|
||||
@ -682,7 +669,7 @@ static void sata_fsl_thaw(struct ata_port *ap)
|
||||
temp = ioread32(hcr_base + HCONTROL);
|
||||
iowrite32((temp | DEFAULT_PORT_IRQ_ENABLE_MASK), hcr_base + HCONTROL);
|
||||
|
||||
VPRINTK("xx_thaw : HControl = 0x%x, HStatus = 0x%x\n",
|
||||
ata_port_dbg(ap, "HControl = 0x%x, HStatus = 0x%x\n",
|
||||
ioread32(hcr_base + HCONTROL), ioread32(hcr_base + HSTATUS));
|
||||
}
|
||||
|
||||
@ -744,8 +731,9 @@ static int sata_fsl_port_start(struct ata_port *ap)
|
||||
|
||||
ap->private_data = pp;
|
||||
|
||||
VPRINTK("CHBA = 0x%x, cmdentry_phys = 0x%x\n",
|
||||
pp->cmdslot_paddr, pp->cmdentry_paddr);
|
||||
ata_port_dbg(ap, "CHBA = 0x%lx, cmdentry_phys = 0x%lx\n",
|
||||
(unsigned long)pp->cmdslot_paddr,
|
||||
(unsigned long)pp->cmdentry_paddr);
|
||||
|
||||
/* Now, update the CHBA register in host controller cmd register set */
|
||||
iowrite32(pp->cmdslot_paddr & 0xffffffff, hcr_base + CHBA);
|
||||
@ -761,9 +749,9 @@ static int sata_fsl_port_start(struct ata_port *ap)
|
||||
temp = ioread32(hcr_base + HCONTROL);
|
||||
iowrite32((temp | HCONTROL_ONLINE_PHY_RST), hcr_base + HCONTROL);
|
||||
|
||||
VPRINTK("HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS));
|
||||
VPRINTK("HControl = 0x%x\n", ioread32(hcr_base + HCONTROL));
|
||||
VPRINTK("CHBA = 0x%x\n", ioread32(hcr_base + CHBA));
|
||||
ata_port_dbg(ap, "HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS));
|
||||
ata_port_dbg(ap, "HControl = 0x%x\n", ioread32(hcr_base + HCONTROL));
|
||||
ata_port_dbg(ap, "CHBA = 0x%x\n", ioread32(hcr_base + CHBA));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -803,16 +791,15 @@ static unsigned int sata_fsl_dev_classify(struct ata_port *ap)
|
||||
|
||||
temp = ioread32(hcr_base + SIGNATURE);
|
||||
|
||||
VPRINTK("raw sig = 0x%x\n", temp);
|
||||
VPRINTK("HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS));
|
||||
VPRINTK("HControl = 0x%x\n", ioread32(hcr_base + HCONTROL));
|
||||
ata_port_dbg(ap, "HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS));
|
||||
ata_port_dbg(ap, "HControl = 0x%x\n", ioread32(hcr_base + HCONTROL));
|
||||
|
||||
tf.lbah = (temp >> 24) & 0xff;
|
||||
tf.lbam = (temp >> 16) & 0xff;
|
||||
tf.lbal = (temp >> 8) & 0xff;
|
||||
tf.nsect = temp & 0xff;
|
||||
|
||||
return ata_dev_classify(&tf);
|
||||
return ata_port_classify(ap, &tf);
|
||||
}
|
||||
|
||||
static int sata_fsl_hardreset(struct ata_link *link, unsigned int *class,
|
||||
@ -825,8 +812,6 @@ static int sata_fsl_hardreset(struct ata_link *link, unsigned int *class,
|
||||
int i = 0;
|
||||
unsigned long start_jiffies;
|
||||
|
||||
DPRINTK("in xx_hardreset\n");
|
||||
|
||||
try_offline_again:
|
||||
/*
|
||||
* Force host controller to go off-line, aborting current operations
|
||||
@ -852,9 +837,10 @@ static int sata_fsl_hardreset(struct ata_link *link, unsigned int *class,
|
||||
goto try_offline_again;
|
||||
}
|
||||
|
||||
DPRINTK("hardreset, controller off-lined\n");
|
||||
VPRINTK("HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS));
|
||||
VPRINTK("HControl = 0x%x\n", ioread32(hcr_base + HCONTROL));
|
||||
ata_port_dbg(ap, "hardreset, controller off-lined\n"
|
||||
"HStatus = 0x%x HControl = 0x%x\n",
|
||||
ioread32(hcr_base + HSTATUS),
|
||||
ioread32(hcr_base + HCONTROL));
|
||||
|
||||
/*
|
||||
* PHY reset should remain asserted for atleast 1ms
|
||||
@ -882,9 +868,10 @@ static int sata_fsl_hardreset(struct ata_link *link, unsigned int *class,
|
||||
goto err;
|
||||
}
|
||||
|
||||
DPRINTK("hardreset, controller off-lined & on-lined\n");
|
||||
VPRINTK("HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS));
|
||||
VPRINTK("HControl = 0x%x\n", ioread32(hcr_base + HCONTROL));
|
||||
ata_port_dbg(ap, "controller off-lined & on-lined\n"
|
||||
"HStatus = 0x%x HControl = 0x%x\n",
|
||||
ioread32(hcr_base + HSTATUS),
|
||||
ioread32(hcr_base + HCONTROL));
|
||||
|
||||
/*
|
||||
* First, wait for the PHYRDY change to occur before waiting for
|
||||
@ -941,10 +928,7 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class,
|
||||
u8 *cfis;
|
||||
u32 Serror;
|
||||
|
||||
DPRINTK("in xx_softreset\n");
|
||||
|
||||
if (ata_link_offline(link)) {
|
||||
DPRINTK("PHY reports no device\n");
|
||||
*class = ATA_DEV_NONE;
|
||||
return 0;
|
||||
}
|
||||
@ -957,19 +941,17 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class,
|
||||
* reached here, we can send a command to the target device
|
||||
*/
|
||||
|
||||
DPRINTK("Sending SRST/device reset\n");
|
||||
|
||||
ata_tf_init(link->device, &tf);
|
||||
cfis = (u8 *) &pp->cmdentry->cfis;
|
||||
|
||||
/* device reset/SRST is a control register update FIS, uses tag0 */
|
||||
sata_fsl_setup_cmd_hdr_entry(pp, 0,
|
||||
sata_fsl_setup_cmd_hdr_entry(ap, pp, 0,
|
||||
SRST_CMD | CMD_DESC_RES | CMD_DESC_SNOOP_ENABLE, 0, 0, 5);
|
||||
|
||||
tf.ctl |= ATA_SRST; /* setup SRST bit in taskfile control reg */
|
||||
ata_tf_to_fis(&tf, pmp, 0, cfis);
|
||||
|
||||
DPRINTK("Dumping cfis : 0x%x, 0x%x, 0x%x, 0x%x\n",
|
||||
ata_port_dbg(ap, "Dumping cfis : 0x%x, 0x%x, 0x%x, 0x%x\n",
|
||||
cfis[0], cfis[1], cfis[2], cfis[3]);
|
||||
|
||||
/*
|
||||
@ -977,7 +959,7 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class,
|
||||
* other commands are active on the controller/device
|
||||
*/
|
||||
|
||||
DPRINTK("@Softreset, CQ = 0x%x, CA = 0x%x, CC = 0x%x\n",
|
||||
ata_port_dbg(ap, "CQ = 0x%x, CA = 0x%x, CC = 0x%x\n",
|
||||
ioread32(CQ + hcr_base),
|
||||
ioread32(CA + hcr_base), ioread32(CC + hcr_base));
|
||||
|
||||
@ -990,15 +972,16 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class,
|
||||
if (temp & 0x1) {
|
||||
ata_port_warn(ap, "ATA_SRST issue failed\n");
|
||||
|
||||
DPRINTK("Softreset@5000,CQ=0x%x,CA=0x%x,CC=0x%x\n",
|
||||
ata_port_dbg(ap, "Softreset@5000,CQ=0x%x,CA=0x%x,CC=0x%x\n",
|
||||
ioread32(CQ + hcr_base),
|
||||
ioread32(CA + hcr_base), ioread32(CC + hcr_base));
|
||||
|
||||
sata_fsl_scr_read(&ap->link, SCR_ERROR, &Serror);
|
||||
|
||||
DPRINTK("HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS));
|
||||
DPRINTK("HControl = 0x%x\n", ioread32(hcr_base + HCONTROL));
|
||||
DPRINTK("Serror = 0x%x\n", Serror);
|
||||
ata_port_dbg(ap, "HStatus = 0x%x HControl = 0x%x Serror = 0x%x\n",
|
||||
ioread32(hcr_base + HSTATUS),
|
||||
ioread32(hcr_base + HCONTROL),
|
||||
Serror);
|
||||
goto err;
|
||||
}
|
||||
|
||||
@ -1012,8 +995,9 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class,
|
||||
* using ATA signature D2H register FIS to the host controller.
|
||||
*/
|
||||
|
||||
sata_fsl_setup_cmd_hdr_entry(pp, 0, CMD_DESC_RES | CMD_DESC_SNOOP_ENABLE,
|
||||
0, 0, 5);
|
||||
sata_fsl_setup_cmd_hdr_entry(ap, pp, 0,
|
||||
CMD_DESC_RES | CMD_DESC_SNOOP_ENABLE,
|
||||
0, 0, 5);
|
||||
|
||||
tf.ctl &= ~ATA_SRST; /* 2nd H2D Ctl. register FIS */
|
||||
ata_tf_to_fis(&tf, pmp, 0, cfis);
|
||||
@ -1030,8 +1014,6 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class,
|
||||
*/
|
||||
iowrite32(0x01, CC + hcr_base); /* We know it will be cmd#0 always */
|
||||
|
||||
DPRINTK("SATA FSL : Now checking device signature\n");
|
||||
|
||||
*class = ATA_DEV_NONE;
|
||||
|
||||
/* Verify if SStatus indicates device presence */
|
||||
@ -1045,9 +1027,8 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class,
|
||||
|
||||
*class = sata_fsl_dev_classify(ap);
|
||||
|
||||
DPRINTK("class = %d\n", *class);
|
||||
VPRINTK("ccreg = 0x%x\n", ioread32(hcr_base + CC));
|
||||
VPRINTK("cereg = 0x%x\n", ioread32(hcr_base + CE));
|
||||
ata_port_dbg(ap, "ccreg = 0x%x\n", ioread32(hcr_base + CC));
|
||||
ata_port_dbg(ap, "cereg = 0x%x\n", ioread32(hcr_base + CE));
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1058,10 +1039,7 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class,
|
||||
|
||||
static void sata_fsl_error_handler(struct ata_port *ap)
|
||||
{
|
||||
|
||||
DPRINTK("in xx_error_handler\n");
|
||||
sata_pmp_error_handler(ap);
|
||||
|
||||
}
|
||||
|
||||
static void sata_fsl_post_internal_cmd(struct ata_queued_cmd *qc)
|
||||
@ -1102,7 +1080,7 @@ static void sata_fsl_error_intr(struct ata_port *ap)
|
||||
if (unlikely(SError & 0xFFFF0000))
|
||||
sata_fsl_scr_write(&ap->link, SCR_ERROR, SError);
|
||||
|
||||
DPRINTK("error_intr,hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n",
|
||||
ata_port_dbg(ap, "hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n",
|
||||
hstatus, cereg, ioread32(hcr_base + DE), SError);
|
||||
|
||||
/* handle fatal errors */
|
||||
@ -1119,7 +1097,7 @@ static void sata_fsl_error_intr(struct ata_port *ap)
|
||||
|
||||
/* Handle PHYRDY change notification */
|
||||
if (hstatus & INT_ON_PHYRDY_CHG) {
|
||||
DPRINTK("SATA FSL: PHYRDY change indication\n");
|
||||
ata_port_dbg(ap, "PHYRDY change indication\n");
|
||||
|
||||
/* Setup a soft-reset EH action */
|
||||
ata_ehi_hotplugged(ehi);
|
||||
@ -1140,7 +1118,7 @@ static void sata_fsl_error_intr(struct ata_port *ap)
|
||||
*/
|
||||
abort = 1;
|
||||
|
||||
DPRINTK("single device error, CE=0x%x, DE=0x%x\n",
|
||||
ata_port_dbg(ap, "single device error, CE=0x%x, DE=0x%x\n",
|
||||
ioread32(hcr_base + CE), ioread32(hcr_base + DE));
|
||||
|
||||
/* find out the offending link and qc */
|
||||
@ -1245,18 +1223,18 @@ static void sata_fsl_host_intr(struct ata_port *ap)
|
||||
}
|
||||
|
||||
if (unlikely(SError & 0xFFFF0000)) {
|
||||
DPRINTK("serror @host_intr : 0x%x\n", SError);
|
||||
ata_port_dbg(ap, "serror @host_intr : 0x%x\n", SError);
|
||||
sata_fsl_error_intr(ap);
|
||||
}
|
||||
|
||||
if (unlikely(hstatus & status_mask)) {
|
||||
DPRINTK("error interrupt!!\n");
|
||||
ata_port_dbg(ap, "error interrupt!!\n");
|
||||
sata_fsl_error_intr(ap);
|
||||
return;
|
||||
}
|
||||
|
||||
VPRINTK("Status of all queues :\n");
|
||||
VPRINTK("done_mask/CC = 0x%x, CA = 0x%x, CE=0x%x,CQ=0x%x,apqa=0x%llx\n",
|
||||
ata_port_dbg(ap, "Status of all queues :\n");
|
||||
ata_port_dbg(ap, "done_mask/CC = 0x%x, CA = 0x%x, CE=0x%x,CQ=0x%x,apqa=0x%llx\n",
|
||||
done_mask,
|
||||
ioread32(hcr_base + CA),
|
||||
ioread32(hcr_base + CE),
|
||||
@ -1268,15 +1246,13 @@ static void sata_fsl_host_intr(struct ata_port *ap)
|
||||
/* clear CC bit, this will also complete the interrupt */
|
||||
iowrite32(done_mask, hcr_base + CC);
|
||||
|
||||
DPRINTK("Status of all queues :\n");
|
||||
DPRINTK("done_mask/CC = 0x%x, CA = 0x%x, CE=0x%x\n",
|
||||
ata_port_dbg(ap, "Status of all queues: done_mask/CC = 0x%x, CA = 0x%x, CE=0x%x\n",
|
||||
done_mask, ioread32(hcr_base + CA),
|
||||
ioread32(hcr_base + CE));
|
||||
|
||||
for (i = 0; i < SATA_FSL_QUEUE_DEPTH; i++) {
|
||||
if (done_mask & (1 << i))
|
||||
DPRINTK
|
||||
("completing ncq cmd,tag=%d,CC=0x%x,CA=0x%x\n",
|
||||
ata_port_dbg(ap, "completing ncq cmd,tag=%d,CC=0x%x,CA=0x%x\n",
|
||||
i, ioread32(hcr_base + CC),
|
||||
ioread32(hcr_base + CA));
|
||||
}
|
||||
@ -1287,7 +1263,7 @@ static void sata_fsl_host_intr(struct ata_port *ap)
|
||||
iowrite32(1, hcr_base + CC);
|
||||
qc = ata_qc_from_tag(ap, ATA_TAG_INTERNAL);
|
||||
|
||||
DPRINTK("completing non-ncq cmd, CC=0x%x\n",
|
||||
ata_port_dbg(ap, "completing non-ncq cmd, CC=0x%x\n",
|
||||
ioread32(hcr_base + CC));
|
||||
|
||||
if (qc) {
|
||||
@ -1295,7 +1271,7 @@ static void sata_fsl_host_intr(struct ata_port *ap)
|
||||
}
|
||||
} else {
|
||||
/* Spurious Interrupt!! */
|
||||
DPRINTK("spurious interrupt!!, CC = 0x%x\n",
|
||||
ata_port_dbg(ap, "spurious interrupt!!, CC = 0x%x\n",
|
||||
ioread32(hcr_base + CC));
|
||||
iowrite32(done_mask, hcr_base + CC);
|
||||
return;
|
||||
@ -1315,8 +1291,6 @@ static irqreturn_t sata_fsl_interrupt(int irq, void *dev_instance)
|
||||
interrupt_enables = ioread32(hcr_base + HSTATUS);
|
||||
interrupt_enables &= 0x3F;
|
||||
|
||||
DPRINTK("interrupt status 0x%x\n", interrupt_enables);
|
||||
|
||||
if (!interrupt_enables)
|
||||
return IRQ_NONE;
|
||||
|
||||
@ -1369,7 +1343,7 @@ static int sata_fsl_init_controller(struct ata_host *host)
|
||||
iowrite32((temp & ~0x3F), hcr_base + HCONTROL);
|
||||
|
||||
/* Disable interrupt coalescing control(icc), for the moment */
|
||||
DPRINTK("icc = 0x%x\n", ioread32(hcr_base + ICC));
|
||||
dev_dbg(host->dev, "icc = 0x%x\n", ioread32(hcr_base + ICC));
|
||||
iowrite32(0x01000000, hcr_base + ICC);
|
||||
|
||||
/* clear error registers, SError is cleared by libATA */
|
||||
@ -1388,8 +1362,8 @@ static int sata_fsl_init_controller(struct ata_host *host)
|
||||
* callback, that should also initiate the OOB, COMINIT sequence
|
||||
*/
|
||||
|
||||
DPRINTK("HStatus = 0x%x\n", ioread32(hcr_base + HSTATUS));
|
||||
DPRINTK("HControl = 0x%x\n", ioread32(hcr_base + HCONTROL));
|
||||
dev_dbg(host->dev, "HStatus = 0x%x HControl = 0x%x\n",
|
||||
ioread32(hcr_base + HSTATUS), ioread32(hcr_base + HCONTROL));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1406,8 +1380,7 @@ static void sata_fsl_host_stop(struct ata_host *host)
|
||||
* scsi mid-layer and libata interface structures
|
||||
*/
|
||||
static struct scsi_host_template sata_fsl_sht = {
|
||||
ATA_NCQ_SHT("sata_fsl"),
|
||||
.can_queue = SATA_FSL_QUEUE_DEPTH,
|
||||
ATA_NCQ_SHT_QD("sata_fsl", SATA_FSL_QUEUE_DEPTH),
|
||||
.sg_tablesize = SATA_FSL_MAX_PRD_USABLE,
|
||||
.dma_boundary = ATA_DMA_BOUNDARY,
|
||||
};
|
||||
@ -1478,9 +1451,8 @@ static int sata_fsl_probe(struct platform_device *ofdev)
|
||||
iowrite32(temp | TRANSCFG_RX_WATER_MARK, csr_base + TRANSCFG);
|
||||
}
|
||||
|
||||
DPRINTK("@reset i/o = 0x%x\n", ioread32(csr_base + TRANSCFG));
|
||||
DPRINTK("sizeof(cmd_desc) = %d\n", sizeof(struct command_desc));
|
||||
DPRINTK("sizeof(#define cmd_desc) = %d\n", SATA_FSL_CMD_DESC_SIZE);
|
||||
dev_dbg(&ofdev->dev, "@reset i/o = 0x%x\n",
|
||||
ioread32(csr_base + TRANSCFG));
|
||||
|
||||
host_priv = kzalloc(sizeof(struct sata_fsl_host_priv), GFP_KERNEL);
|
||||
if (!host_priv)
|
||||
|
@ -253,12 +253,12 @@ static int gemini_sata_bridge_init(struct sata_gemini *sg)
|
||||
|
||||
ret = clk_prepare_enable(sg->sata0_pclk);
|
||||
if (ret) {
|
||||
pr_err("failed to enable SATA0 PCLK\n");
|
||||
dev_err(dev, "failed to enable SATA0 PCLK\n");
|
||||
return ret;
|
||||
}
|
||||
ret = clk_prepare_enable(sg->sata1_pclk);
|
||||
if (ret) {
|
||||
pr_err("failed to enable SATA1 PCLK\n");
|
||||
dev_err(dev, "failed to enable SATA1 PCLK\n");
|
||||
clk_disable_unprepare(sg->sata0_pclk);
|
||||
return ret;
|
||||
}
|
||||
|
@ -488,8 +488,6 @@ static enum ata_completion_errors inic_qc_prep(struct ata_queued_cmd *qc)
|
||||
bool is_data = ata_is_data(qc->tf.protocol);
|
||||
unsigned int cdb_len = 0;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
if (is_atapi)
|
||||
cdb_len = qc->dev->cdb_len;
|
||||
|
||||
@ -657,7 +655,7 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class,
|
||||
}
|
||||
|
||||
inic_tf_read(ap, &tf);
|
||||
*class = ata_dev_classify(&tf);
|
||||
*class = ata_port_classify(ap, &tf);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -579,7 +579,7 @@ struct mv_hw_ops {
|
||||
void (*enable_leds)(struct mv_host_priv *hpriv, void __iomem *mmio);
|
||||
void (*read_preamp)(struct mv_host_priv *hpriv, int idx,
|
||||
void __iomem *mmio);
|
||||
int (*reset_hc)(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
int (*reset_hc)(struct ata_host *host, void __iomem *mmio,
|
||||
unsigned int n_hc);
|
||||
void (*reset_flash)(struct mv_host_priv *hpriv, void __iomem *mmio);
|
||||
void (*reset_bus)(struct ata_host *host, void __iomem *mmio);
|
||||
@ -606,7 +606,7 @@ static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
static void mv5_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio);
|
||||
static void mv5_read_preamp(struct mv_host_priv *hpriv, int idx,
|
||||
void __iomem *mmio);
|
||||
static int mv5_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
static int mv5_reset_hc(struct ata_host *host, void __iomem *mmio,
|
||||
unsigned int n_hc);
|
||||
static void mv5_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio);
|
||||
static void mv5_reset_bus(struct ata_host *host, void __iomem *mmio);
|
||||
@ -616,14 +616,14 @@ static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
static void mv6_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio);
|
||||
static void mv6_read_preamp(struct mv_host_priv *hpriv, int idx,
|
||||
void __iomem *mmio);
|
||||
static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
static int mv6_reset_hc(struct ata_host *host, void __iomem *mmio,
|
||||
unsigned int n_hc);
|
||||
static void mv6_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio);
|
||||
static void mv_soc_enable_leds(struct mv_host_priv *hpriv,
|
||||
void __iomem *mmio);
|
||||
static void mv_soc_read_preamp(struct mv_host_priv *hpriv, int idx,
|
||||
void __iomem *mmio);
|
||||
static int mv_soc_reset_hc(struct mv_host_priv *hpriv,
|
||||
static int mv_soc_reset_hc(struct ata_host *host,
|
||||
void __iomem *mmio, unsigned int n_hc);
|
||||
static void mv_soc_reset_flash(struct mv_host_priv *hpriv,
|
||||
void __iomem *mmio);
|
||||
@ -1248,81 +1248,74 @@ static int mv_stop_edma(struct ata_port *ap)
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef ATA_DEBUG
|
||||
static void mv_dump_mem(void __iomem *start, unsigned bytes)
|
||||
static void mv_dump_mem(struct device *dev, void __iomem *start, unsigned bytes)
|
||||
{
|
||||
int b, w;
|
||||
int b, w, o;
|
||||
unsigned char linebuf[38];
|
||||
|
||||
for (b = 0; b < bytes; ) {
|
||||
DPRINTK("%p: ", start + b);
|
||||
for (w = 0; b < bytes && w < 4; w++) {
|
||||
printk("%08x ", readl(start + b));
|
||||
for (w = 0, o = 0; b < bytes && w < 4; w++) {
|
||||
o += snprintf(linebuf + o, sizeof(linebuf) - o,
|
||||
"%08x ", readl(start + b));
|
||||
b += sizeof(u32);
|
||||
}
|
||||
printk("\n");
|
||||
dev_dbg(dev, "%s: %p: %s\n",
|
||||
__func__, start + b, linebuf);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(ATA_DEBUG) || defined(CONFIG_PCI)
|
||||
|
||||
static void mv_dump_pci_cfg(struct pci_dev *pdev, unsigned bytes)
|
||||
{
|
||||
#ifdef ATA_DEBUG
|
||||
int b, w;
|
||||
u32 dw;
|
||||
int b, w, o;
|
||||
u32 dw = 0;
|
||||
unsigned char linebuf[38];
|
||||
|
||||
for (b = 0; b < bytes; ) {
|
||||
DPRINTK("%02x: ", b);
|
||||
for (w = 0; b < bytes && w < 4; w++) {
|
||||
for (w = 0, o = 0; b < bytes && w < 4; w++) {
|
||||
(void) pci_read_config_dword(pdev, b, &dw);
|
||||
printk("%08x ", dw);
|
||||
o += snprintf(linebuf + o, sizeof(linebuf) - o,
|
||||
"%08x ", dw);
|
||||
b += sizeof(u32);
|
||||
}
|
||||
printk("\n");
|
||||
dev_dbg(&pdev->dev, "%s: %02x: %s\n",
|
||||
__func__, b, linebuf);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
static void mv_dump_all_regs(void __iomem *mmio_base, int port,
|
||||
|
||||
static void mv_dump_all_regs(void __iomem *mmio_base,
|
||||
struct pci_dev *pdev)
|
||||
{
|
||||
#ifdef ATA_DEBUG
|
||||
void __iomem *hc_base = mv_hc_base(mmio_base,
|
||||
port >> MV_PORT_HC_SHIFT);
|
||||
void __iomem *hc_base;
|
||||
void __iomem *port_base;
|
||||
int start_port, num_ports, p, start_hc, num_hcs, hc;
|
||||
|
||||
if (0 > port) {
|
||||
start_hc = start_port = 0;
|
||||
num_ports = 8; /* shld be benign for 4 port devs */
|
||||
num_hcs = 2;
|
||||
} else {
|
||||
start_hc = port >> MV_PORT_HC_SHIFT;
|
||||
start_port = port;
|
||||
num_ports = num_hcs = 1;
|
||||
}
|
||||
DPRINTK("All registers for port(s) %u-%u:\n", start_port,
|
||||
num_ports > 1 ? num_ports - 1 : start_port);
|
||||
start_hc = start_port = 0;
|
||||
num_ports = 8; /* should be benign for 4 port devs */
|
||||
num_hcs = 2;
|
||||
dev_dbg(&pdev->dev,
|
||||
"%s: All registers for port(s) %u-%u:\n", __func__,
|
||||
start_port, num_ports > 1 ? num_ports - 1 : start_port);
|
||||
|
||||
if (NULL != pdev) {
|
||||
DPRINTK("PCI config space regs:\n");
|
||||
mv_dump_pci_cfg(pdev, 0x68);
|
||||
}
|
||||
DPRINTK("PCI regs:\n");
|
||||
mv_dump_mem(mmio_base+0xc00, 0x3c);
|
||||
mv_dump_mem(mmio_base+0xd00, 0x34);
|
||||
mv_dump_mem(mmio_base+0xf00, 0x4);
|
||||
mv_dump_mem(mmio_base+0x1d00, 0x6c);
|
||||
dev_dbg(&pdev->dev, "%s: PCI config space regs:\n", __func__);
|
||||
mv_dump_pci_cfg(pdev, 0x68);
|
||||
|
||||
dev_dbg(&pdev->dev, "%s: PCI regs:\n", __func__);
|
||||
mv_dump_mem(&pdev->dev, mmio_base+0xc00, 0x3c);
|
||||
mv_dump_mem(&pdev->dev, mmio_base+0xd00, 0x34);
|
||||
mv_dump_mem(&pdev->dev, mmio_base+0xf00, 0x4);
|
||||
mv_dump_mem(&pdev->dev, mmio_base+0x1d00, 0x6c);
|
||||
for (hc = start_hc; hc < start_hc + num_hcs; hc++) {
|
||||
hc_base = mv_hc_base(mmio_base, hc);
|
||||
DPRINTK("HC regs (HC %i):\n", hc);
|
||||
mv_dump_mem(hc_base, 0x1c);
|
||||
dev_dbg(&pdev->dev, "%s: HC regs (HC %i):\n", __func__, hc);
|
||||
mv_dump_mem(&pdev->dev, hc_base, 0x1c);
|
||||
}
|
||||
for (p = start_port; p < start_port + num_ports; p++) {
|
||||
port_base = mv_port_base(mmio_base, p);
|
||||
DPRINTK("EDMA regs (port %i):\n", p);
|
||||
mv_dump_mem(port_base, 0x54);
|
||||
DPRINTK("SATA regs (port %i):\n", p);
|
||||
mv_dump_mem(port_base+0x300, 0x60);
|
||||
dev_dbg(&pdev->dev, "%s: EDMA regs (port %i):\n", __func__, p);
|
||||
mv_dump_mem(&pdev->dev, port_base, 0x54);
|
||||
dev_dbg(&pdev->dev, "%s: SATA regs (port %i):\n", __func__, p);
|
||||
mv_dump_mem(&pdev->dev, port_base+0x300, 0x60);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static unsigned int mv_scr_offset(unsigned int sc_reg_in)
|
||||
@ -2962,8 +2955,8 @@ static int mv_pci_error(struct ata_host *host, void __iomem *mmio)
|
||||
|
||||
dev_err(host->dev, "PCI ERROR; PCI IRQ cause=0x%08x\n", err_cause);
|
||||
|
||||
DPRINTK("All regs @ PCI error\n");
|
||||
mv_dump_all_regs(mmio, -1, to_pci_dev(host->dev));
|
||||
dev_dbg(host->dev, "%s: All regs @ PCI error\n", __func__);
|
||||
mv_dump_all_regs(mmio, to_pci_dev(host->dev));
|
||||
|
||||
writelfl(0, mmio + hpriv->irq_cause_offset);
|
||||
|
||||
@ -3201,9 +3194,10 @@ static void mv5_reset_one_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
}
|
||||
#undef ZERO
|
||||
|
||||
static int mv5_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
static int mv5_reset_hc(struct ata_host *host, void __iomem *mmio,
|
||||
unsigned int n_hc)
|
||||
{
|
||||
struct mv_host_priv *hpriv = host->private_data;
|
||||
unsigned int hc, port;
|
||||
|
||||
for (hc = 0; hc < n_hc; hc++) {
|
||||
@ -3262,7 +3256,7 @@ static void mv6_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio)
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*/
|
||||
static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
static int mv6_reset_hc(struct ata_host *host, void __iomem *mmio,
|
||||
unsigned int n_hc)
|
||||
{
|
||||
void __iomem *reg = mmio + PCI_MAIN_CMD_STS;
|
||||
@ -3282,7 +3276,7 @@ static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
break;
|
||||
}
|
||||
if (!(PCI_MASTER_EMPTY & t)) {
|
||||
printk(KERN_ERR DRV_NAME ": PCI master won't flush\n");
|
||||
dev_err(host->dev, "PCI master won't flush\n");
|
||||
rc = 1;
|
||||
goto done;
|
||||
}
|
||||
@ -3296,7 +3290,7 @@ static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
} while (!(GLOB_SFT_RST & t) && (i-- > 0));
|
||||
|
||||
if (!(GLOB_SFT_RST & t)) {
|
||||
printk(KERN_ERR DRV_NAME ": can't set global reset\n");
|
||||
dev_err(host->dev, "can't set global reset\n");
|
||||
rc = 1;
|
||||
goto done;
|
||||
}
|
||||
@ -3310,7 +3304,7 @@ static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio,
|
||||
} while ((GLOB_SFT_RST & t) && (i-- > 0));
|
||||
|
||||
if (GLOB_SFT_RST & t) {
|
||||
printk(KERN_ERR DRV_NAME ": can't clear global reset\n");
|
||||
dev_err(host->dev, "can't clear global reset\n");
|
||||
rc = 1;
|
||||
}
|
||||
done:
|
||||
@ -3479,9 +3473,10 @@ static void mv_soc_reset_one_hc(struct mv_host_priv *hpriv,
|
||||
|
||||
#undef ZERO
|
||||
|
||||
static int mv_soc_reset_hc(struct mv_host_priv *hpriv,
|
||||
static int mv_soc_reset_hc(struct ata_host *host,
|
||||
void __iomem *mmio, unsigned int n_hc)
|
||||
{
|
||||
struct mv_host_priv *hpriv = host->private_data;
|
||||
unsigned int port;
|
||||
|
||||
for (port = 0; port < hpriv->n_ports; port++)
|
||||
@ -3723,11 +3718,6 @@ static void mv_port_init(struct ata_ioports *port, void __iomem *port_mmio)
|
||||
|
||||
/* unmask all non-transient EDMA error interrupts */
|
||||
writelfl(~EDMA_ERR_IRQ_TRANSIENT, port_mmio + EDMA_ERR_IRQ_MASK);
|
||||
|
||||
VPRINTK("EDMA cfg=0x%08x EDMA IRQ err cause/mask=0x%08x/0x%08x\n",
|
||||
readl(port_mmio + EDMA_CFG),
|
||||
readl(port_mmio + EDMA_ERR_IRQ_CAUSE),
|
||||
readl(port_mmio + EDMA_ERR_IRQ_MASK));
|
||||
}
|
||||
|
||||
static unsigned int mv_in_pcix_mode(struct ata_host *host)
|
||||
@ -3859,11 +3849,11 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx)
|
||||
*
|
||||
* Warn the user, lest they think we're just buggy.
|
||||
*/
|
||||
printk(KERN_WARNING DRV_NAME ": Highpoint RocketRAID"
|
||||
dev_warn(&pdev->dev, "Highpoint RocketRAID"
|
||||
" BIOS CORRUPTS DATA on all attached drives,"
|
||||
" regardless of if/how they are configured."
|
||||
" BEWARE!\n");
|
||||
printk(KERN_WARNING DRV_NAME ": For data safety, do not"
|
||||
dev_warn(&pdev->dev, "For data safety, do not"
|
||||
" use sectors 8-9 on \"Legacy\" drives,"
|
||||
" and avoid the final two gigabytes on"
|
||||
" all RocketRAID BIOS initialized drives.\n");
|
||||
@ -3954,7 +3944,7 @@ static int mv_init_host(struct ata_host *host)
|
||||
if (hpriv->ops->read_preamp)
|
||||
hpriv->ops->read_preamp(hpriv, port, mmio);
|
||||
|
||||
rc = hpriv->ops->reset_hc(hpriv, mmio, n_hc);
|
||||
rc = hpriv->ops->reset_hc(host, mmio, n_hc);
|
||||
if (rc)
|
||||
goto done;
|
||||
|
||||
@ -3972,7 +3962,7 @@ static int mv_init_host(struct ata_host *host)
|
||||
for (hc = 0; hc < n_hc; hc++) {
|
||||
void __iomem *hc_mmio = mv_hc_base(mmio, hc);
|
||||
|
||||
VPRINTK("HC%i: HC config=0x%08x HC IRQ cause "
|
||||
dev_dbg(host->dev, "HC%i: HC config=0x%08x HC IRQ cause "
|
||||
"(before clear)=0x%08x\n", hc,
|
||||
readl(hc_mmio + HC_CFG),
|
||||
readl(hc_mmio + HC_IRQ_CAUSE));
|
||||
@ -4270,7 +4260,7 @@ static int mv_platform_resume(struct platform_device *pdev)
|
||||
/* initialize adapter */
|
||||
ret = mv_init_host(host);
|
||||
if (ret) {
|
||||
printk(KERN_ERR DRV_NAME ": Error during HW init\n");
|
||||
dev_err(&pdev->dev, "Error during HW init\n");
|
||||
return ret;
|
||||
}
|
||||
ata_host_resume(host);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user