diff options
30 files changed, 0 insertions, 16308 deletions
diff --git a/Documentation/netlabel/draft-ietf-cipso-ipsecurity-01.txt b/Documentation/netlabel/draft-ietf-cipso-ipsecurity-01.txt deleted file mode 100644 index 256c2c9d4f50..000000000000 --- a/Documentation/netlabel/draft-ietf-cipso-ipsecurity-01.txt +++ /dev/null @@ -1,791 +0,0 @@ -IETF CIPSO Working Group -16 July, 1992 - - - - COMMERCIAL IP SECURITY OPTION (CIPSO 2.2) - - - -1. Status - -This Internet Draft provides the high level specification for a Commercial -IP Security Option (CIPSO). This draft reflects the version as approved by -the CIPSO IETF Working Group. Distribution of this memo is unlimited. - -This document is an Internet Draft. Internet Drafts are working documents -of the Internet Engineering Task Force (IETF), its Areas, and its Working -Groups. Note that other groups may also distribute working documents as -Internet Drafts. - -Internet Drafts are draft documents valid for a maximum of six months. -Internet Drafts may be updated, replaced, or obsoleted by other documents -at any time. It is not appropriate to use Internet Drafts as reference -material or to cite them other than as a "working draft" or "work in -progress." - -Please check the I-D abstract listing contained in each Internet Draft -directory to learn the current status of this or any other Internet Draft. - - - - -2. Background - -Currently the Internet Protocol includes two security options. One of -these options is the DoD Basic Security Option (BSO) (Type 130) which allows -IP datagrams to be labeled with security classifications. This option -provides sixteen security classifications and a variable number of handling -restrictions. To handle additional security information, such as security -categories or compartments, another security option (Type 133) exists and -is referred to as the DoD Extended Security Option (ESO). The values for -the fixed fields within these two options are administered by the Defense -Information Systems Agency (DISA). - -Computer vendors are now building commercial operating systems with -mandatory access controls and multi-level security. These systems are -no longer built specifically for a particular group in the defense or -intelligence communities. They are generally available commercial systems -for use in a variety of government and civil sector environments. - -The small number of ESO format codes can not support all the possible -applications of a commercial security option. The BSO and ESO were -designed to only support the United States DoD. CIPSO has been designed -to support multiple security policies. This Internet Draft provides the -format and procedures required to support a Mandatory Access Control -security policy. Support for additional security policies shall be -defined in future RFCs. - - - - -Internet Draft, Expires 15 Jan 93 [PAGE 1] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - - -3. CIPSO Format - -Option type: 134 (Class 0, Number 6, Copy on Fragmentation) -Option length: Variable - -This option permits security related information to be passed between -systems within a single Domain of Interpretation (DOI). A DOI is a -collection of systems which agree on the meaning of particular values -in the security option. An authority that has been assigned a DOI -identifier will define a mapping between appropriate CIPSO field values -and their human readable equivalent. This authority will distribute that -mapping to hosts within the authority's domain. These mappings may be -sensitive, therefore a DOI authority is not required to make these -mappings available to anyone other than the systems that are included in -the DOI. - -This option MUST be copied on fragmentation. This option appears at most -once in a datagram. All multi-octet fields in the option are defined to be -transmitted in network byte order. The format of this option is as follows: - -+----------+----------+------//------+-----------//---------+ -| 10000110 | LLLLLLLL | DDDDDDDDDDDD | TTTTTTTTTTTTTTTTTTTT | -+----------+----------+------//------+-----------//---------+ - - TYPE=134 OPTION DOMAIN OF TAGS - LENGTH INTERPRETATION - - - Figure 1. CIPSO Format - - -3.1 Type - -This field is 1 octet in length. Its value is 134. - - -3.2 Length - -This field is 1 octet in length. It is the total length of the option -including the type and length fields. With the current IP header length -restriction of 40 octets the value of this field MUST not exceed 40. - - -3.3 Domain of Interpretation Identifier - -This field is an unsigned 32 bit integer. The value 0 is reserved and MUST -not appear as the DOI identifier in any CIPSO option. Implementations -should assume that the DOI identifier field is not aligned on any particular -byte boundary. - -To conserve space in the protocol, security levels and categories are -represented by numbers rather than their ASCII equivalent. This requires -a mapping table within CIPSO hosts to map these numbers to their -corresponding ASCII representations. Non-related groups of systems may - - - -Internet Draft, Expires 15 Jan 93 [PAGE 2] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - -have their own unique mappings. For example, one group of systems may -use the number 5 to represent Unclassified while another group may use the -number 1 to represent that same security level. The DOI identifier is used -to identify which mapping was used for the values within the option. - - -3.4 Tag Types - -A common format for passing security related information is necessary -for interoperability. CIPSO uses sets of "tags" to contain the security -information relevant to the data in the IP packet. Each tag begins with -a tag type identifier followed by the length of the tag and ends with the -actual security information to be passed. All multi-octet fields in a tag -are defined to be transmitted in network byte order. Like the DOI -identifier field in the CIPSO header, implementations should assume that -all tags, as well as fields within a tag, are not aligned on any particular -octet boundary. The tag types defined in this document contain alignment -bytes to assist alignment of some information, however alignment can not -be guaranteed if CIPSO is not the first IP option. - -CIPSO tag types 0 through 127 are reserved for defining standard tag -formats. Their definitions will be published in RFCs. Tag types whose -identifiers are greater than 127 are defined by the DOI authority and may -only be meaningful in certain Domains of Interpretation. For these tag -types, implementations will require the DOI identifier as well as the tag -number to determine the security policy and the format associated with the -tag. Use of tag types above 127 are restricted to closed networks where -interoperability with other networks will not be an issue. Implementations -that support a tag type greater than 127 MUST support at least one DOI that -requires only tag types 1 to 127. - -Tag type 0 is reserved. Tag types 1, 2, and 5 are defined in this -Internet Draft. Types 3 and 4 are reserved for work in progress. -The standard format for all current and future CIPSO tags is shown below: - -+----------+----------+--------//--------+ -| TTTTTTTT | LLLLLLLL | IIIIIIIIIIIIIIII | -+----------+----------+--------//--------+ - TAG TAG TAG - TYPE LENGTH INFORMATION - - Figure 2: Standard Tag Format - -In the three tag types described in this document, the length and count -restrictions are based on the current IP limitation of 40 octets for all -IP options. If the IP header is later expanded, then the length and count -restrictions specified in this document may increase to use the full area -provided for IP options. - - -3.4.1 Tag Type Classes - -Tag classes consist of tag types that have common processing requirements -and support the same security policy. The three tags defined in this -Internet Draft belong to the Mandatory Access Control (MAC) Sensitivity - - - -Internet Draft, Expires 15 Jan 93 [PAGE 3] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - -class and support the MAC Sensitivity security policy. - - -3.4.2 Tag Type 1 - -This is referred to as the "bit-mapped" tag type. Tag type 1 is included -in the MAC Sensitivity tag type class. The format of this tag type is as -follows: - -+----------+----------+----------+----------+--------//---------+ -| 00000001 | LLLLLLLL | 00000000 | LLLLLLLL | CCCCCCCCCCCCCCCCC | -+----------+----------+----------+----------+--------//---------+ - - TAG TAG ALIGNMENT SENSITIVITY BIT MAP OF - TYPE LENGTH OCTET LEVEL CATEGORIES - - Figure 3. Tag Type 1 Format - - -3.4.2.1 Tag Type - -This field is 1 octet in length and has a value of 1. - - -3.4.2.2 Tag Length - -This field is 1 octet in length. It is the total length of the tag type -including the type and length fields. With the current IP header length -restriction of 40 bytes the value within this field is between 4 and 34. - - -3.4.2.3 Alignment Octet - -This field is 1 octet in length and always has the value of 0. Its purpose -is to align the category bitmap field on an even octet boundary. This will -speed many implementations including router implementations. - - -3.4.2.4 Sensitivity Level - -This field is 1 octet in length. Its value is from 0 to 255. The values -are ordered with 0 being the minimum value and 255 representing the maximum -value. - - -3.4.2.5 Bit Map of Categories - -The length of this field is variable and ranges from 0 to 30 octets. This -provides representation of categories 0 to 239. The ordering of the bits -is left to right or MSB to LSB. For example category 0 is represented by -the most significant bit of the first byte and category 15 is represented -by the least significant bit of the second byte. Figure 4 graphically -shows this ordering. Bit N is binary 1 if category N is part of the label -for the datagram, and bit N is binary 0 if category N is not part of the -label. Except for the optimized tag 1 format described in the next section, - - - -Internet Draft, Expires 15 Jan 93 [PAGE 4] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - -minimal encoding SHOULD be used resulting in no trailing zero octets in the -category bitmap. - - octet 0 octet 1 octet 2 octet 3 octet 4 octet 5 - XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX . . . -bit 01234567 89111111 11112222 22222233 33333333 44444444 -number 012345 67890123 45678901 23456789 01234567 - - Figure 4. Ordering of Bits in Tag 1 Bit Map - - -3.4.2.6 Optimized Tag 1 Format - -Routers work most efficiently when processing fixed length fields. To -support these routers there is an optimized form of tag type 1. The format -does not change. The only change is to the category bitmap which is set to -a constant length of 10 octets. Trailing octets required to fill out the 10 -octets are zero filled. Ten octets, allowing for 80 categories, was chosen -because it makes the total length of the CIPSO option 20 octets. If CIPSO -is the only option then the option will be full word aligned and additional -filler octets will not be required. - - -3.4.3 Tag Type 2 - -This is referred to as the "enumerated" tag type. It is used to describe -large but sparsely populated sets of categories. Tag type 2 is in the MAC -Sensitivity tag type class. The format of this tag type is as follows: - -+----------+----------+----------+----------+-------------//-------------+ -| 00000010 | LLLLLLLL | 00000000 | LLLLLLLL | CCCCCCCCCCCCCCCCCCCCCCCCCC | -+----------+----------+----------+----------+-------------//-------------+ - - TAG TAG ALIGNMENT SENSITIVITY ENUMERATED - TYPE LENGTH OCTET LEVEL CATEGORIES - - Figure 5. Tag Type 2 Format - - -3.4.3.1 Tag Type - -This field is one octet in length and has a value of 2. - - -3.4.3.2 Tag Length - -This field is 1 octet in length. It is the total length of the tag type -including the type and length fields. With the current IP header length -restriction of 40 bytes the value within this field is between 4 and 34. - - -3.4.3.3 Alignment Octet - -This field is 1 octet in length and always has the value of 0. Its purpose -is to align the category field on an even octet boundary. This will - - - -Internet Draft, Expires 15 Jan 93 [PAGE 5] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - -speed many implementations including router implementations. - - -3.4.3.4 Sensitivity Level - -This field is 1 octet in length. Its value is from 0 to 255. The values -are ordered with 0 being the minimum value and 255 representing the -maximum value. - - -3.4.3.5 Enumerated Categories - -In this tag, categories are represented by their actual value rather than -by their position within a bit field. The length of each category is 2 -octets. Up to 15 categories may be represented by this tag. Valid values -for categories are 0 to 65534. Category 65535 is not a valid category -value. The categories MUST be listed in ascending order within the tag. - - -3.4.4 Tag Type 5 - -This is referred to as the "range" tag type. It is used to represent -labels where all categories in a range, or set of ranges, are included -in the sensitivity label. Tag type 5 is in the MAC Sensitivity tag type -class. The format of this tag type is as follows: - -+----------+----------+----------+----------+------------//-------------+ -| 00000101 | LLLLLLLL | 00000000 | LLLLLLLL | Top/Bottom | Top/Bottom | -+----------+----------+----------+----------+------------//-------------+ - - TAG TAG ALIGNMENT SENSITIVITY CATEGORY RANGES - TYPE LENGTH OCTET LEVEL - - Figure 6. Tag Type 5 Format - - -3.4.4.1 Tag Type - -This field is one octet in length and has a value of 5. - - -3.4.4.2 Tag Length - -This field is 1 octet in length. It is the total length of the tag type -including the type and length fields. With the current IP header length -restriction of 40 bytes the value within this field is between 4 and 34. - - -3.4.4.3 Alignment Octet - -This field is 1 octet in length and always has the value of 0. Its purpose -is to align the category range field on an even octet boundary. This will -speed many implementations including router implementations. - - - - - -Internet Draft, Expires 15 Jan 93 [PAGE 6] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - -3.4.4.4 Sensitivity Level - -This field is 1 octet in length. Its value is from 0 to 255. The values -are ordered with 0 being the minimum value and 255 representing the maximum -value. - - -3.4.4.5 Category Ranges - -A category range is a 4 octet field comprised of the 2 octet index of the -highest numbered category followed by the 2 octet index of the lowest -numbered category. These range endpoints are inclusive within the range of -categories. All categories within a range are included in the sensitivity -label. This tag may contain a maximum of 7 category pairs. The bottom -category endpoint for the last pair in the tag MAY be omitted and SHOULD be -assumed to be 0. The ranges MUST be non-overlapping and be listed in -descending order. Valid values for categories are 0 to 65534. Category -65535 is not a valid category value. - - -3.4.5 Minimum Requirements - -A CIPSO implementation MUST be capable of generating at least tag type 1 in -the non-optimized form. In addition, a CIPSO implementation MUST be able -to receive any valid tag type 1 even those using the optimized tag type 1 -format. - - -4. Configuration Parameters - -The configuration parameters defined below are required for all CIPSO hosts, -gateways, and routers that support multiple sensitivity labels. A CIPSO -host is defined to be the origination or destination system for an IP -datagram. A CIPSO gateway provides IP routing services between two or more -IP networks and may be required to perform label translations between -networks. A CIPSO gateway may be an enhanced CIPSO host or it may just -provide gateway services with no end system CIPSO capabilities. A CIPSO -router is a dedicated IP router that routes IP datagrams between two or more -IP networks. - -An implementation of CIPSO on a host MUST have the capability to reject a -datagram for reasons that the information contained can not be adequately -protected by the receiving host or if acceptance may result in violation of -the host or network security policy. In addition, a CIPSO gateway or router -MUST be able to reject datagrams going to networks that can not provide -adequate protection or may violate the network's security policy. To -provide this capability the following minimal set of configuration -parameters are required for CIPSO implementations: - -HOST_LABEL_MAX - This parameter contains the maximum sensitivity label that -a CIPSO host is authorized to handle. All datagrams that have a label -greater than this maximum MUST be rejected by the CIPSO host. This -parameter does not apply to CIPSO gateways or routers. This parameter need -not be defined explicitly as it can be implicitly derived from the -PORT_LABEL_MAX parameters for the associated interfaces. - - - -Internet Draft, Expires 15 Jan 93 [PAGE 7] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - - -HOST_LABEL_MIN - This parameter contains the minimum sensitivity label that -a CIPSO host is authorized to handle. All datagrams that have a label less -than this minimum MUST be rejected by the CIPSO host. This parameter does -not apply to CIPSO gateways or routers. This parameter need not be defined -explicitly as it can be implicitly derived from the PORT_LABEL_MIN -parameters for the associated interfaces. - -PORT_LABEL_MAX - This parameter contains the maximum sensitivity label for -all datagrams that may exit a particular network interface port. All -outgoing datagrams that have a label greater than this maximum MUST be -rejected by the CIPSO system. The label within this parameter MUST be -less than or equal to the label within the HOST_LABEL_MAX parameter. This -parameter does not apply to CIPSO hosts that support only one network port. - -PORT_LABEL_MIN - This parameter contains the minimum sensitivity label for -all datagrams that may exit a particular network interface port. All -outgoing datagrams that have a label less than this minimum MUST be -rejected by the CIPSO system. The label within this parameter MUST be -greater than or equal to the label within the HOST_LABEL_MIN parameter. -This parameter does not apply to CIPSO hosts that support only one network -port. - -PORT_DOI - This parameter is used to assign a DOI identifier value to a -particular network interface port. All CIPSO labels within datagrams -going out this port MUST use the specified DOI identifier. All CIPSO -hosts and gateways MUST support either this parameter, the NET_DOI -parameter, or the HOST_DOI parameter. - -NET_DOI - This parameter is used to assign a DOI identifier value to a -particular IP network address. All CIPSO labels within datagrams destined -for the particular IP network MUST use the specified DOI identifier. All -CIPSO hosts and gateways MUST support either this parameter, the PORT_DOI -parameter, or the HOST_DOI parameter. - -HOST_DOI - This parameter is used to assign a DOI identifier value to a -particular IP host address. All CIPSO labels within datagrams destined for -the particular IP host will use the specified DOI identifier. All CIPSO -hosts and gateways MUST support either this parameter, the PORT_DOI -parameter, or the NET_DOI parameter. - -This list represents the minimal set of configuration parameters required -to be compliant. Implementors are encouraged to add to this list to -provide enhanced functionality and control. For example, many security -policies may require both incoming and outgoing datagrams be checked against -the port and host label ranges. - - -4.1 Port Range Parameters - -The labels represented by the PORT_LABEL_MAX and PORT_LABEL_MIN parameters -MAY be in CIPSO or local format. Some CIPSO systems, such as routers, may -want to have the range parameters expressed in CIPSO format so that incoming -labels do not have to be converted to a local format before being compared -against the range. If multiple DOIs are supported by one of these CIPSO - - - -Internet Draft, Expires 15 Jan 93 [PAGE 8] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - -systems then multiple port range parameters would be needed, one set for -each DOI supported on a particular port. - -The port range will usually represent the total set of labels that may -exist on the logical network accessed through the corresponding network -interface. It may, however, represent a subset of these labels that are -allowed to enter the CIPSO system. - - -4.2 Single Label CIPSO Hosts - -CIPSO implementations that support only one label are not required to -support the parameters described above. These limited implementations are -only required to support a NET_LABEL parameter. This parameter contains -the CIPSO label that may be inserted in datagrams that exit the host. In -addition, the host MUST reject any incoming datagram that has a label which -is not equivalent to the NET_LABEL parameter. - - -5. Handling Procedures - -This section describes the processing requirements for incoming and -outgoing IP datagrams. Just providing the correct CIPSO label format -is not enough. Assumptions will be made by one system on how a -receiving system will handle the CIPSO label. Wrong assumptions may -lead to non-interoperability or even a security incident. The -requirements described below represent the minimal set needed for -interoperability and that provide users some level of confidence. -Many other requirements could be added to increase user confidence, -however at the risk of restricting creativity and limiting vendor -participation. - - -5.1 Input Procedures - -All datagrams received through a network port MUST have a security label -associated with them, either contained in the datagram or assigned to the -receiving port. Without this label the host, gateway, or router will not -have the information it needs to make security decisions. This security -label will be obtained from the CIPSO if the option is present in the -datagram. See section 4.1.2 for handling procedures for unlabeled -datagrams. This label will be compared against the PORT (if appropriate) -and HOST configuration parameters defined in section 3. - -If any field within the CIPSO option, such as the DOI identifier, is not -recognized the IP datagram is discarded and an ICMP "parameter problem" -(type 12) is generated and returned. The ICMP code field is set to "bad -parameter" (code 0) and the pointer is set to the start of the CIPSO field -that is unrecognized. - -If the contents of the CIPSO are valid but the security label is -outside of the configured host or port label range, the datagram is -discarded and an ICMP "destination unreachable" (type 3) is generated -and returned. The code field of the ICMP is set to "communication with -destination network administratively prohibited" (code 9) or to - - - -Internet Draft, Expires 15 Jan 93 [PAGE 9] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - -"communication with destination host administratively prohibited" -(code 10). The value of the code field used is dependent upon whether -the originator of the ICMP message is acting as a CIPSO host or a CIPSO -gateway. The recipient of the ICMP message MUST be able to handle either -value. The same procedure is performed if a CIPSO can not be added to an -IP packet because it is too large to fit in the IP options area. - -If the error is triggered by receipt of an ICMP message, the message -is discarded and no response is permitted (consistent with general ICMP -processing rules). - - -5.1.1 Unrecognized tag types - -The default condition for any CIPSO implementation is that an -unrecognized tag type MUST be treated as a "parameter problem" and -handled as described in section 4.1. A CIPSO implementation MAY allow -the system administrator to identify tag types that may safely be -ignored. This capability is an allowable enhancement, not a -requirement. - - -5.1.2 Unlabeled Packets - -A network port may be configured to not require a CIPSO label for all -incoming datagrams. For this configuration a CIPSO label must be -assigned to that network port and associated with all unlabeled IP -datagrams. This capability might be used for single level networks or -networks that have CIPSO and non-CIPSO hosts and the non-CIPSO hosts -all operate at the same label. - -If a CIPSO option is required and none is found, the datagram is -discarded and an ICMP "parameter problem" (type 12) is generated and -returned to the originator of the datagram. The code field of the ICMP -is set to "option missing" (code 1) and the ICMP pointer is set to 134 -(the value of the option type for the missing CIPSO option). - - -5.2 Output Procedures - -A CIPSO option MUST appear only once in a datagram. Only one tag type -from the MAC Sensitivity class MAY be included in a CIPSO option. Given -the current set of defined tag types, this means that CIPSO labels at -first will contain only one tag. - -All datagrams leaving a CIPSO system MUST meet the following condition: - - PORT_LABEL_MIN <= CIPSO label <= PORT_LABEL_MAX - -If this condition is not satisfied the datagram MUST be discarded. -If the CIPSO system only supports one port, the HOST_LABEL_MIN and the -HOST_LABEL_MAX parameters MAY be substituted for the PORT parameters in -the above condition. - -The DOI identifier to be used for all outgoing datagrams is configured by - - - -Internet Draft, Expires 15 Jan 93 [PAGE 10] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - -the administrator. If port level DOI identifier assignment is used, then -the PORT_DOI configuration parameter MUST contain the DOI identifier to -use. If network level DOI assignment is used, then the NET_DOI parameter -MUST contain the DOI identifier to use. And if host level DOI assignment -is employed, then the HOST_DOI parameter MUST contain the DOI identifier -to use. A CIPSO implementation need only support one level of DOI -assignment. - - -5.3 DOI Processing Requirements - -A CIPSO implementation MUST support at least one DOI and SHOULD support -multiple DOIs. System and network administrators are cautioned to -ensure that at least one DOI is common within an IP network to allow for -broadcasting of IP datagrams. - -CIPSO gateways MUST be capable of translating a CIPSO option from one -DOI to another when forwarding datagrams between networks. For -efficiency purposes this capability is only a desired feature for CIPSO -routers. - - -5.4 Label of ICMP Messages - -The CIPSO label to be used on all outgoing ICMP messages MUST be equivalent -to the label of the datagram that caused the ICMP message. If the ICMP was -generated due to a problem associated with the original CIPSO label then the -following responses are allowed: - - a. Use the CIPSO label of the original IP datagram - b. Drop the original datagram with no return message generated - -In most cases these options will have the same effect. If you can not -interpret the label or if it is outside the label range of your host or -interface then an ICMP message with the same label will probably not be -able to exit the system. - - -6. Assignment of DOI Identifier Numbers = - -Requests for assignment of a DOI identifier number should be addressed to -the Internet Assigned Numbers Authority (IANA). - - -7. Acknowledgements - -Much of the material in this RFC is based on (and copied from) work -done by Gary Winiger of Sun Microsystems and published as Commercial -IP Security Option at the INTEROP 89, Commercial IPSO Workshop. - - -8. Author's Address - -To submit mail for distribution to members of the IETF CIPSO Working -Group, send mail to: cipso@wdl1.wdl.loral.com. - - - -Internet Draft, Expires 15 Jan 93 [PAGE 11] - - - -CIPSO INTERNET DRAFT 16 July, 1992 - - - - -To be added to or deleted from this distribution, send mail to: -cipso-request@wdl1.wdl.loral.com. - - -9. References - -RFC 1038, "Draft Revised IP Security Option", M. St. Johns, IETF, January -1988. - -RFC 1108, "U.S. Department of Defense Security Options -for the Internet Protocol", Stephen Kent, IAB, 1 March, 1991. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Internet Draft, Expires 15 Jan 93 [PAGE 12] - - - diff --git a/arch/powerpc/platforms/8xx/micropatch.c b/arch/powerpc/platforms/8xx/micropatch.c deleted file mode 100644 index aef179fcbd4f..000000000000 --- a/arch/powerpc/platforms/8xx/micropatch.c +++ /dev/null @@ -1,388 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 - -/* - * Microcode patches for the CPM as supplied by Motorola. - * This is the one for IIC/SPI. There is a newer one that - * also relocates SMC2, but this would require additional changes - * to uart.c, so I am holding off on that for a moment. - */ -#include <linux/init.h> -#include <linux/errno.h> -#include <linux/sched.h> -#include <linux/kernel.h> -#include <linux/param.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/interrupt.h> -#include <asm/irq.h> -#include <asm/page.h> -#include <asm/8xx_immap.h> -#include <asm/cpm.h> -#include <asm/cpm1.h> - -struct patch_params { - ushort rccr; - ushort cpmcr1; - ushort cpmcr2; - ushort cpmcr3; - ushort cpmcr4; -}; - -/* - * I2C/SPI relocation patch arrays. - */ - -#ifdef CONFIG_I2C_SPI_UCODE_PATCH - -static char patch_name[] __initdata = "I2C/SPI"; - -static struct patch_params patch_params __initdata = { - 1, 0x802a, 0x8028, 0x802e, 0x802c, -}; - -static uint patch_2000[] __initdata = { - 0x7FFFEFD9, 0x3FFD0000, 0x7FFB49F7, 0x7FF90000, - 0x5FEFADF7, 0x5F89ADF7, 0x5FEFAFF7, 0x5F89AFF7, - 0x3A9CFBC8, 0xE7C0EDF0, 0x77C1E1BB, 0xF4DC7F1D, - 0xABAD932F, 0x4E08FDCF, 0x6E0FAFF8, 0x7CCF76CF, - 0xFD1FF9CF, 0xABF88DC6, 0xAB5679F7, 0xB0937383, - 0xDFCE79F7, 0xB091E6BB, 0xE5BBE74F, 0xB3FA6F0F, - 0x6FFB76CE, 0xEE0DF9CF, 0x2BFBEFEF, 0xCFEEF9CF, - 0x76CEAD24, 0x90B2DF9A, 0x7FDDD0BF, 0x4BF847FD, - 0x7CCF76CE, 0xCFEF7E1F, 0x7F1D7DFD, 0xF0B6EF71, - 0x7FC177C1, 0xFBC86079, 0xE722FBC8, 0x5FFFDFFF, - 0x5FB2FFFB, 0xFBC8F3C8, 0x94A67F01, 0x7F1D5F39, - 0xAFE85F5E, 0xFFDFDF96, 0xCB9FAF7D, 0x5FC1AFED, - 0x8C1C5FC1, 0xAFDD5FC3, 0xDF9A7EFD, 0xB0B25FB2, - 0xFFFEABAD, 0x5FB2FFFE, 0x5FCE600B, 0xE6BB600B, - 0x5FCEDFC6, 0x27FBEFDF, 0x5FC8CFDE, 0x3A9CE7C0, - 0xEDF0F3C8, 0x7F0154CD, 0x7F1D2D3D, 0x363A7570, - 0x7E0AF1CE, 0x37EF2E68, 0x7FEE10EC, 0xADF8EFDE, - 0xCFEAE52F, 0x7D0FE12B, 0xF1CE5F65, 0x7E0A4DF8, - 0xCFEA5F72, 0x7D0BEFEE, 0xCFEA5F74, 0xE522EFDE, - 0x5F74CFDA, 0x0B627385, 0xDF627E0A, 0x30D8145B, - 0xBFFFF3C8, 0x5FFFDFFF, 0xA7F85F5E, 0xBFFE7F7D, - 0x10D31450, 0x5F36BFFF, 0xAF785F5E, 0xBFFDA7F8, - 0x5F36BFFE, 0x77FD30C0, 0x4E08FDCF, 0xE5FF6E0F, - 0xAFF87E1F, 0x7E0FFD1F, 0xF1CF5F1B, 0xABF80D5E, - 0x5F5EFFEF, 0x79F730A2, 0xAFDD5F34, 0x47F85F34, - 0xAFED7FDD, 0x50B24978, 0x47FD7F1D, 0x7DFD70AD, - 0xEF717EC1, 0x6BA47F01, 0x2D267EFD, 0x30DE5F5E, - 0xFFFD5F5E, 0xFFEF5F5E, 0xFFDF0CA0, 0xAFED0A9E, - 0xAFDD0C3A, 0x5F3AAFBD, 0x7FBDB082, 0x5F8247F8 -}; - -static uint patch_2f00[] __initdata = { - 0x3E303430, 0x34343737, 0xABF7BF9B, 0x994B4FBD, - 0xBD599493, 0x349FFF37, 0xFB9B177D, 0xD9936956, - 0xBBFDD697, 0xBDD2FD11, 0x31DB9BB3, 0x63139637, - 0x93733693, 0x193137F7, 0x331737AF, 0x7BB9B999, - 0xBB197957, 0x7FDFD3D5, 0x73B773F7, 0x37933B99, - 0x1D115316, 0x99315315, 0x31694BF4, 0xFBDBD359, - 0x31497353, 0x76956D69, 0x7B9D9693, 0x13131979, - 0x79376935 -}; - -static uint patch_2e00[] __initdata = {}; -#endif - -/* - * I2C/SPI/SMC1 relocation patch arrays. - */ - -#ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH - -static char patch_name[] __initdata = "I2C/SPI/SMC1"; - -static struct patch_params patch_params __initdata = { - 3, 0x8080, 0x808a, 0x8028, 0x802a, -}; - -static uint patch_2000[] __initdata = { - 0x3fff0000, 0x3ffd0000, 0x3ffb0000, 0x3ff90000, - 0x5f13eff8, 0x5eb5eff8, 0x5f88adf7, 0x5fefadf7, - 0x3a9cfbc8, 0x77cae1bb, 0xf4de7fad, 0xabae9330, - 0x4e08fdcf, 0x6e0faff8, 0x7ccf76cf, 0xfdaff9cf, - 0xabf88dc8, 0xab5879f7, 0xb0925d8d, 0xdfd079f7, - 0xb090e6bb, 0xe5bbe74f, 0x9e046f0f, 0x6ffb76ce, - 0xee0cf9cf, 0x2bfbefef, 0xcfeef9cf, 0x76cead23, - 0x90b3df99, 0x7fddd0c1, 0x4bf847fd, 0x7ccf76ce, - 0xcfef77ca, 0x7eaf7fad, 0x7dfdf0b7, 0xef7a7fca, - 0x77cafbc8, 0x6079e722, 0xfbc85fff, 0xdfff5fb3, - 0xfffbfbc8, 0xf3c894a5, 0xe7c9edf9, 0x7f9a7fad, - 0x5f36afe8, 0x5f5bffdf, 0xdf95cb9e, 0xaf7d5fc3, - 0xafed8c1b, 0x5fc3afdd, 0x5fc5df99, 0x7efdb0b3, - 0x5fb3fffe, 0xabae5fb3, 0xfffe5fd0, 0x600be6bb, - 0x600b5fd0, 0xdfc827fb, 0xefdf5fca, 0xcfde3a9c, - 0xe7c9edf9, 0xf3c87f9e, 0x54ca7fed, 0x2d3a3637, - 0x756f7e9a, 0xf1ce37ef, 0x2e677fee, 0x10ebadf8, - 0xefdecfea, 0xe52f7d9f, 0xe12bf1ce, 0x5f647e9a, - 0x4df8cfea, 0x5f717d9b, 0xefeecfea, 0x5f73e522, - 0xefde5f73, 0xcfda0b61, 0x5d8fdf61, 0xe7c9edf9, - 0x7e9a30d5, 0x1458bfff, 0xf3c85fff, 0xdfffa7f8, - 0x5f5bbffe, 0x7f7d10d0, 0x144d5f33, 0xbfffaf78, - 0x5f5bbffd, 0xa7f85f33, 0xbffe77fd, 0x30bd4e08, - 0xfdcfe5ff, 0x6e0faff8, 0x7eef7e9f, 0xfdeff1cf, - 0x5f17abf8, 0x0d5b5f5b, 0xffef79f7, 0x309eafdd, - 0x5f3147f8, 0x5f31afed, 0x7fdd50af, 0x497847fd, - 0x7f9e7fed, 0x7dfd70a9, 0xef7e7ece, 0x6ba07f9e, - 0x2d227efd, 0x30db5f5b, 0xfffd5f5b, 0xffef5f5b, - 0xffdf0c9c, 0xafed0a9a, 0xafdd0c37, 0x5f37afbd, - 0x7fbdb081, 0x5f8147f8, 0x3a11e710, 0xedf0ccdd, - 0xf3186d0a, 0x7f0e5f06, 0x7fedbb38, 0x3afe7468, - 0x7fedf4fc, 0x8ffbb951, 0xb85f77fd, 0xb0df5ddd, - 0xdefe7fed, 0x90e1e74d, 0x6f0dcbf7, 0xe7decfed, - 0xcb74cfed, 0xcfeddf6d, 0x91714f74, 0x5dd2deef, - 0x9e04e7df, 0xefbb6ffb, 0xe7ef7f0e, 0x9e097fed, - 0xebdbeffa, 0xeb54affb, 0x7fea90d7, 0x7e0cf0c3, - 0xbffff318, 0x5fffdfff, 0xac59efea, 0x7fce1ee5, - 0xe2ff5ee1, 0xaffbe2ff, 0x5ee3affb, 0xf9cc7d0f, - 0xaef8770f, 0x7d0fb0c6, 0xeffbbfff, 0xcfef5ede, - 0x7d0fbfff, 0x5ede4cf8, 0x7fddd0bf, 0x49f847fd, - 0x7efdf0bb, 0x7fedfffd, 0x7dfdf0b7, 0xef7e7e1e, - 0x5ede7f0e, 0x3a11e710, 0xedf0ccab, 0xfb18ad2e, - 0x1ea9bbb8, 0x74283b7e, 0x73c2e4bb, 0x2ada4fb8, - 0xdc21e4bb, 0xb2a1ffbf, 0x5e2c43f8, 0xfc87e1bb, - 0xe74ffd91, 0x6f0f4fe8, 0xc7ba32e2, 0xf396efeb, - 0x600b4f78, 0xe5bb760b, 0x53acaef8, 0x4ef88b0e, - 0xcfef9e09, 0xabf8751f, 0xefef5bac, 0x741f4fe8, - 0x751e760d, 0x7fdbf081, 0x741cafce, 0xefcc7fce, - 0x751e70ac, 0x741ce7bb, 0x3372cfed, 0xafdbefeb, - 0xe5bb760b, 0x53f2aef8, 0xafe8e7eb, 0x4bf8771e, - 0x7e247fed, 0x4fcbe2cc, 0x7fbc30a9, 0x7b0f7a0f, - 0x34d577fd, 0x308b5db7, 0xde553e5f, 0xaf78741f, - 0x741f30f0, 0xcfef5e2c, 0x741f3eac, 0xafb8771e, - 0x5e677fed, 0x0bd3e2cc, 0x741ccfec, 0xe5ca53cd, - 0x6fcb4f74, 0x5dadde4b, 0x2ab63d38, 0x4bb3de30, - 0x751f741c, 0x6c42effa, 0xefea7fce, 0x6ffc30be, - 0xefec3fca, 0x30b3de2e, 0xadf85d9e, 0xaf7daefd, - 0x5d9ede2e, 0x5d9eafdd, 0x761f10ac, 0x1da07efd, - 0x30adfffe, 0x4908fb18, 0x5fffdfff, 0xafbb709b, - 0x4ef85e67, 0xadf814ad, 0x7a0f70ad, 0xcfef50ad, - 0x7a0fde30, 0x5da0afed, 0x3c12780f, 0xefef780f, - 0xefef790f, 0xa7f85e0f, 0xffef790f, 0xefef790f, - 0x14adde2e, 0x5d9eadfd, 0x5e2dfffb, 0xe79addfd, - 0xeff96079, 0x607ae79a, 0xddfceff9, 0x60795dff, - 0x607acfef, 0xefefefdf, 0xefbfef7f, 0xeeffedff, - 0xebffe7ff, 0xafefafdf, 0xafbfaf7f, 0xaeffadff, - 0xabffa7ff, 0x6fef6fdf, 0x6fbf6f7f, 0x6eff6dff, - 0x6bff67ff, 0x2fef2fdf, 0x2fbf2f7f, 0x2eff2dff, - 0x2bff27ff, 0x4e08fd1f, 0xe5ff6e0f, 0xaff87eef, - 0x7e0ffdef, 0xf11f6079, 0xabf8f542, 0x7e0af11c, - 0x37cfae3a, 0x7fec90be, 0xadf8efdc, 0xcfeae52f, - 0x7d0fe12b, 0xf11c6079, 0x7e0a4df8, 0xcfea5dc4, - 0x7d0befec, 0xcfea5dc6, 0xe522efdc, 0x5dc6cfda, - 0x4e08fd1f, 0x6e0faff8, 0x7c1f761f, 0xfdeff91f, - 0x6079abf8, 0x761cee24, 0xf91f2bfb, 0xefefcfec, - 0xf91f6079, 0x761c27fb, 0xefdf5da7, 0xcfdc7fdd, - 0xd09c4bf8, 0x47fd7c1f, 0x761ccfcf, 0x7eef7fed, - 0x7dfdf093, 0xef7e7f1e, 0x771efb18, 0x6079e722, - 0xe6bbe5bb, 0xae0ae5bb, 0x600bae85, 0xe2bbe2bb, - 0xe2bbe2bb, 0xaf02e2bb, 0xe2bb2ff9, 0x6079e2bb -}; - -static uint patch_2f00[] __initdata = { - 0x30303030, 0x3e3e3434, 0xabbf9b99, 0x4b4fbdbd, - 0x59949334, 0x9fff37fb, 0x9b177dd9, 0x936956bb, - 0xfbdd697b, 0xdd2fd113, 0x1db9f7bb, 0x36313963, - 0x79373369, 0x3193137f, 0x7331737a, 0xf7bb9b99, - 0x9bb19795, 0x77fdfd3d, 0x573b773f, 0x737933f7, - 0xb991d115, 0x31699315, 0x31531694, 0xbf4fbdbd, - 0x35931497, 0x35376956, 0xbd697b9d, 0x96931313, - 0x19797937, 0x6935af78, 0xb9b3baa3, 0xb8788683, - 0x368f78f7, 0x87778733, 0x3ffffb3b, 0x8e8f78b8, - 0x1d118e13, 0xf3ff3f8b, 0x6bd8e173, 0xd1366856, - 0x68d1687b, 0x3daf78b8, 0x3a3a3f87, 0x8f81378f, - 0xf876f887, 0x77fd8778, 0x737de8d6, 0xbbf8bfff, - 0xd8df87f7, 0xfd876f7b, 0x8bfff8bd, 0x8683387d, - 0xb873d87b, 0x3b8fd7f8, 0xf7338883, 0xbb8ee1f8, - 0xef837377, 0x3337b836, 0x817d11f8, 0x7378b878, - 0xd3368b7d, 0xed731b7d, 0x833731f3, 0xf22f3f23 -}; - -static uint patch_2e00[] __initdata = { - 0x27eeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, - 0xee4bf4fb, 0xdbd259bb, 0x1979577f, 0xdfd2d573, - 0xb773f737, 0x4b4fbdbd, 0x25b9b177, 0xd2d17376, - 0x956bbfdd, 0x697bdd2f, 0xff9f79ff, 0xff9ff22f -}; -#endif - -/* - * USB SOF patch arrays. - */ - -#ifdef CONFIG_USB_SOF_UCODE_PATCH - -static char patch_name[] __initdata = "USB SOF"; - -static struct patch_params patch_params __initdata = { - 9, -}; - -static uint patch_2000[] __initdata = { - 0x7fff0000, 0x7ffd0000, 0x7ffb0000, 0x49f7ba5b, - 0xba383ffb, 0xf9b8b46d, 0xe5ab4e07, 0xaf77bffe, - 0x3f7bbf79, 0xba5bba38, 0xe7676076, 0x60750000 -}; - -static uint patch_2f00[] __initdata = { - 0x3030304c, 0xcab9e441, 0xa1aaf220 -}; - -static uint patch_2e00[] __initdata = {}; -#endif - -/* - * SMC relocation patch arrays. - */ - -#ifdef CONFIG_SMC_UCODE_PATCH - -static char patch_name[] __initdata = "SMC"; - -static struct patch_params patch_params __initdata = { - 2, 0x8080, 0x8088, -}; - -static uint patch_2000[] __initdata = { - 0x3fff0000, 0x3ffd0000, 0x3ffb0000, 0x3ff90000, - 0x5fefeff8, 0x5f91eff8, 0x3ff30000, 0x3ff10000, - 0x3a11e710, 0xedf0ccb9, 0xf318ed66, 0x7f0e5fe2, - 0x7fedbb38, 0x3afe7468, 0x7fedf4d8, 0x8ffbb92d, - 0xb83b77fd, 0xb0bb5eb9, 0xdfda7fed, 0x90bde74d, - 0x6f0dcbd3, 0xe7decfed, 0xcb50cfed, 0xcfeddf6d, - 0x914d4f74, 0x5eaedfcb, 0x9ee0e7df, 0xefbb6ffb, - 0xe7ef7f0e, 0x9ee57fed, 0xebb7effa, 0xeb30affb, - 0x7fea90b3, 0x7e0cf09f, 0xbffff318, 0x5fffdfff, - 0xac35efea, 0x7fce1fc1, 0xe2ff5fbd, 0xaffbe2ff, - 0x5fbfaffb, 0xf9a87d0f, 0xaef8770f, 0x7d0fb0a2, - 0xeffbbfff, 0xcfef5fba, 0x7d0fbfff, 0x5fba4cf8, - 0x7fddd09b, 0x49f847fd, 0x7efdf097, 0x7fedfffd, - 0x7dfdf093, 0xef7e7e1e, 0x5fba7f0e, 0x3a11e710, - 0xedf0cc87, 0xfb18ad0a, 0x1f85bbb8, 0x74283b7e, - 0x7375e4bb, 0x2ab64fb8, 0x5c7de4bb, 0x32fdffbf, - 0x5f0843f8, 0x7ce3e1bb, 0xe74f7ded, 0x6f0f4fe8, - 0xc7ba32be, 0x73f2efeb, 0x600b4f78, 0xe5bb760b, - 0x5388aef8, 0x4ef80b6a, 0xcfef9ee5, 0xabf8751f, - 0xefef5b88, 0x741f4fe8, 0x751e760d, 0x7fdb70dd, - 0x741cafce, 0xefcc7fce, 0x751e7088, 0x741ce7bb, - 0x334ecfed, 0xafdbefeb, 0xe5bb760b, 0x53ceaef8, - 0xafe8e7eb, 0x4bf8771e, 0x7e007fed, 0x4fcbe2cc, - 0x7fbc3085, 0x7b0f7a0f, 0x34b177fd, 0xb0e75e93, - 0xdf313e3b, 0xaf78741f, 0x741f30cc, 0xcfef5f08, - 0x741f3e88, 0xafb8771e, 0x5f437fed, 0x0bafe2cc, - 0x741ccfec, 0xe5ca53a9, 0x6fcb4f74, 0x5e89df27, - 0x2a923d14, 0x4b8fdf0c, 0x751f741c, 0x6c1eeffa, - 0xefea7fce, 0x6ffc309a, 0xefec3fca, 0x308fdf0a, - 0xadf85e7a, 0xaf7daefd, 0x5e7adf0a, 0x5e7aafdd, - 0x761f1088, 0x1e7c7efd, 0x3089fffe, 0x4908fb18, - 0x5fffdfff, 0xafbbf0f7, 0x4ef85f43, 0xadf81489, - 0x7a0f7089, 0xcfef5089, 0x7a0fdf0c, 0x5e7cafed, - 0xbc6e780f, 0xefef780f, 0xefef790f, 0xa7f85eeb, - 0xffef790f, 0xefef790f, 0x1489df0a, 0x5e7aadfd, - 0x5f09fffb, 0xe79aded9, 0xeff96079, 0x607ae79a, - 0xded8eff9, 0x60795edb, 0x607acfef, 0xefefefdf, - 0xefbfef7f, 0xeeffedff, 0xebffe7ff, 0xafefafdf, - 0xafbfaf7f, 0xaeffadff, 0xabffa7ff, 0x6fef6fdf, - 0x6fbf6f7f, 0x6eff6dff, 0x6bff67ff, 0x2fef2fdf, - 0x2fbf2f7f, 0x2eff2dff, 0x2bff27ff, 0x4e08fd1f, - 0xe5ff6e0f, 0xaff87eef, 0x7e0ffdef, 0xf11f6079, - 0xabf8f51e, 0x7e0af11c, 0x37cfae16, 0x7fec909a, - 0xadf8efdc, 0xcfeae52f, 0x7d0fe12b, 0xf11c6079, - 0x7e0a4df8, 0xcfea5ea0, 0x7d0befec, 0xcfea5ea2, - 0xe522efdc, 0x5ea2cfda, 0x4e08fd1f, 0x6e0faff8, - 0x7c1f761f, 0xfdeff91f, 0x6079abf8, 0x761cee00, - 0xf91f2bfb, 0xefefcfec, 0xf91f6079, 0x761c27fb, - 0xefdf5e83, 0xcfdc7fdd, 0x50f84bf8, 0x47fd7c1f, - 0x761ccfcf, 0x7eef7fed, 0x7dfd70ef, 0xef7e7f1e, - 0x771efb18, 0x6079e722, 0xe6bbe5bb, 0x2e66e5bb, - 0x600b2ee1, 0xe2bbe2bb, 0xe2bbe2bb, 0x2f5ee2bb, - 0xe2bb2ff9, 0x6079e2bb, -}; - -static uint patch_2f00[] __initdata = { - 0x30303030, 0x3e3e3030, 0xaf79b9b3, 0xbaa3b979, - 0x9693369f, 0x79f79777, 0x97333fff, 0xfb3b9e9f, - 0x79b91d11, 0x9e13f3ff, 0x3f9b6bd9, 0xe173d136, - 0x695669d1, 0x697b3daf, 0x79b93a3a, 0x3f979f91, - 0x379ff976, 0xf99777fd, 0x9779737d, 0xe9d6bbf9, - 0xbfffd9df, 0x97f7fd97, 0x6f7b9bff, 0xf9bd9683, - 0x397db973, 0xd97b3b9f, 0xd7f9f733, 0x9993bb9e, - 0xe1f9ef93, 0x73773337, 0xb936917d, 0x11f87379, - 0xb979d336, 0x8b7ded73, 0x1b7d9337, 0x31f3f22f, - 0x3f2327ee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, - 0xeeeeee4b, 0xf4fbdbd2, 0x58bb1878, 0x577fdfd2, - 0xd573b773, 0xf7374b4f, 0xbdbd25b8, 0xb177d2d1, - 0x7376856b, 0xbfdd687b, 0xdd2fff8f, 0x78ffff8f, - 0xf22f0000, -}; - -static uint patch_2e00[] __initdata = {}; -#endif - -static void __init cpm_write_patch(cpm8xx_t *cp, int offset, uint *patch, int len) -{ - if (!len) - return; - memcpy_toio(cp->cp_dpmem + offset, patch, len); -} - -void __init cpm_load_patch(cpm8xx_t *cp) -{ - out_be16(&cp->cp_rccr, 0); - - cpm_write_patch(cp, 0, patch_2000, sizeof(patch_2000)); - cpm_write_patch(cp, 0xf00, patch_2f00, sizeof(patch_2f00)); - cpm_write_patch(cp, 0xe00, patch_2e00, sizeof(patch_2e00)); - - if (IS_ENABLED(CONFIG_I2C_SPI_UCODE_PATCH) || - IS_ENABLED(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)) { - u16 rpbase = 0x500; - iic_t *iip; - struct spi_pram *spp; - - iip = (iic_t *)&cp->cp_dparam[PROFF_IIC]; - out_be16(&iip->iic_rpbase, rpbase); - - /* Put SPI above the IIC, also 32-byte aligned. */ - spp = (struct spi_pram *)&cp->cp_dparam[PROFF_SPI]; - out_be16(&spp->rpbase, (rpbase + sizeof(iic_t) + 31) & ~31); - - if (IS_ENABLED(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)) { - smc_uart_t *smp; - - smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC1]; - out_be16(&smp->smc_rpbase, 0x1FC0); - } - } - - if (IS_ENABLED(CONFIG_SMC_UCODE_PATCH)) { - smc_uart_t *smp; - - if (IS_ENABLED(CONFIG_PPC_EARLY_DEBUG_CPM)) { - int i; - - for (i = 0; i < sizeof(*smp); i += 4) { - u32 __iomem *src = (u32 __iomem *)&cp->cp_dparam[PROFF_SMC1 + i]; - u32 __iomem *dst = (u32 __iomem *)&cp->cp_dparam[PROFF_DSP1 + i]; - - out_be32(dst, in_be32(src)); - } - } - - smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC1]; - out_be16(&smp->smc_rpbase, 0x1ec0); - smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC2]; - out_be16(&smp->smc_rpbase, 0x1fc0); - } - - out_be16(&cp->cp_cpmcr1, patch_params.cpmcr1); - out_be16(&cp->cp_cpmcr2, patch_params.cpmcr2); - out_be16(&cp->cp_cpmcr3, patch_params.cpmcr3); - out_be16(&cp->cp_cpmcr4, patch_params.cpmcr4); - - out_be16(&cp->cp_rccr, patch_params.rccr); - - pr_info("%s microcode patch installed\n", patch_name); -} diff --git a/drivers/media/i2c/vs6624.c b/drivers/media/i2c/vs6624.c deleted file mode 100644 index c292c92e37b9..000000000000 --- a/drivers/media/i2c/vs6624.c +++ /dev/null @@ -1,856 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * vs6624.c ST VS6624 CMOS image sensor driver - * - * Copyright (c) 2011 Analog Devices Inc. - */ - -#include <linux/delay.h> -#include <linux/errno.h> -#include <linux/gpio.h> -#include <linux/i2c.h> -#include <linux/init.h> -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/types.h> -#include <linux/videodev2.h> - -#include <media/v4l2-ctrls.h> -#include <media/v4l2-device.h> -#include <media/v4l2-mediabus.h> -#include <media/v4l2-image-sizes.h> - -#include "vs6624_regs.h" - -#define MAX_FRAME_RATE 30 - -struct vs6624 { - struct v4l2_subdev sd; - struct v4l2_ctrl_handler hdl; - struct v4l2_fract frame_rate; - struct v4l2_mbus_framefmt fmt; - unsigned ce_pin; -}; - -static const struct vs6624_format { - u32 mbus_code; - enum v4l2_colorspace colorspace; -} vs6624_formats[] = { - { - .mbus_code = MEDIA_BUS_FMT_UYVY8_2X8, - .colorspace = V4L2_COLORSPACE_JPEG, - }, - { - .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8, - .colorspace = V4L2_COLORSPACE_JPEG, - }, - { - .mbus_code = MEDIA_BUS_FMT_RGB565_2X8_LE, - .colorspace = V4L2_COLORSPACE_SRGB, - }, -}; - -static const struct v4l2_mbus_framefmt vs6624_default_fmt = { - .width = VGA_WIDTH, - .height = VGA_HEIGHT, - .code = MEDIA_BUS_FMT_UYVY8_2X8, - .field = V4L2_FIELD_NONE, - .colorspace = V4L2_COLORSPACE_JPEG, -}; - -static const u16 vs6624_p1[] = { - 0x8104, 0x03, - 0x8105, 0x01, - 0xc900, 0x03, - 0xc904, 0x47, - 0xc905, 0x10, - 0xc906, 0x80, - 0xc907, 0x3a, - 0x903a, 0x02, - 0x903b, 0x47, - 0x903c, 0x15, - 0xc908, 0x31, - 0xc909, 0xdc, - 0xc90a, 0x80, - 0xc90b, 0x44, - 0x9044, 0x02, - 0x9045, 0x31, - 0x9046, 0xe2, - 0xc90c, 0x07, - 0xc90d, 0xe0, - 0xc90e, 0x80, - 0xc90f, 0x47, - 0x9047, 0x90, - 0x9048, 0x83, - 0x9049, 0x81, - 0x904a, 0xe0, - 0x904b, 0x60, - 0x904c, 0x08, - 0x904d, 0x90, - 0x904e, 0xc0, - 0x904f, 0x43, - 0x9050, 0x74, - 0x9051, 0x01, - 0x9052, 0xf0, - 0x9053, 0x80, - 0x9054, 0x05, - 0x9055, 0xE4, - 0x9056, 0x90, - 0x9057, 0xc0, - 0x9058, 0x43, - 0x9059, 0xf0, - 0x905a, 0x02, - 0x905b, 0x07, - 0x905c, 0xec, - 0xc910, 0x5d, - 0xc911, 0xca, - 0xc912, 0x80, - 0xc913, 0x5d, - 0x905d, 0xa3, - 0x905e, 0x04, - 0x905f, 0xf0, - 0x9060, 0xa3, - 0x9061, 0x04, - 0x9062, 0xf0, - 0x9063, 0x22, - 0xc914, 0x72, - 0xc915, 0x92, - 0xc916, 0x80, - 0xc917, 0x64, - 0x9064, 0x74, - 0x9065, 0x01, - 0x9066, 0x02, - 0x9067, 0x72, - 0x9068, 0x95, - 0xc918, 0x47, - 0xc919, 0xf2, - 0xc91a, 0x81, - 0xc91b, 0x69, - 0x9169, 0x74, - 0x916a, 0x02, - 0x916b, 0xf0, - 0x916c, 0xec, - 0x916d, 0xb4, - 0x916e, 0x10, - 0x916f, 0x0a, - 0x9170, 0x90, - 0x9171, 0x80, - 0x9172, 0x16, - 0x9173, 0xe0, - 0x9174, 0x70, - 0x9175, 0x04, - 0x9176, 0x90, - 0x9177, 0xd3, - 0x9178, 0xc4, - 0x9179, 0xf0, - 0x917a, 0x22, - 0xc91c, 0x0a, - 0xc91d, 0xbe, - 0xc91e, 0x80, - 0xc91f, 0x73, - 0x9073, 0xfc, - 0x9074, 0xa3, - 0x9075, 0xe0, - 0x9076, 0xf5, - 0x9077, 0x82, - 0x9078, 0x8c, - 0x9079, 0x83, - 0x907a, 0xa3, - 0x907b, 0xa3, - 0x907c, 0xe0, - 0x907d, 0xfc, - 0x907e, 0xa3, - 0x907f, 0xe0, - 0x9080, 0xc3, - 0x9081, 0x9f, - 0x9082, 0xff, - 0x9083, 0xec, - 0x9084, 0x9e, - 0x9085, 0xfe, - 0x9086, 0x02, - 0x9087, 0x0a, - 0x9088, 0xea, - 0xc920, 0x47, - 0xc921, 0x38, - 0xc922, 0x80, - 0xc923, 0x89, - 0x9089, 0xec, - 0x908a, 0xd3, - 0x908b, 0x94, - 0x908c, 0x20, - 0x908d, 0x40, - 0x908e, 0x01, - 0x908f, 0x1c, - 0x9090, 0x90, - 0x9091, 0xd3, - 0x9092, 0xd4, - 0x9093, 0xec, - 0x9094, 0xf0, - 0x9095, 0x02, - 0x9096, 0x47, - 0x9097, 0x3d, - 0xc924, 0x45, - 0xc925, 0xca, - 0xc926, 0x80, - 0xc927, 0x98, - 0x9098, 0x12, - 0x9099, 0x77, - 0x909a, 0xd6, - 0x909b, 0x02, - 0x909c, 0x45, - 0x909d, 0xcd, - 0xc928, 0x20, - 0xc929, 0xd5, - 0xc92a, 0x80, - 0xc92b, 0x9e, - 0x909e, 0x90, - 0x909f, 0x82, - 0x90a0, 0x18, - 0x90a1, 0xe0, - 0x90a2, 0xb4, - 0x90a3, 0x03, - 0x90a4, 0x0e, - 0x90a5, 0x90, - 0x90a6, 0x83, - 0x90a7, 0xbf, - 0x90a8, 0xe0, - 0x90a9, 0x60, - 0x90aa, 0x08, - 0x90ab, 0x90, - 0x90ac, 0x81, - 0x90ad, 0xfc, - 0x90ae, 0xe0, - 0x90af, 0xff, - 0x90b0, 0xc3, - 0x90b1, 0x13, - 0x90b2, 0xf0, - 0x90b3, 0x90, - 0x90b4, 0x81, - 0x90b5, 0xfc, - 0x90b6, 0xe0, - 0x90b7, 0xff, - 0x90b8, 0x02, - 0x90b9, 0x20, - 0x90ba, 0xda, - 0xc92c, 0x70, - 0xc92d, 0xbc, - 0xc92e, 0x80, - 0xc92f, 0xbb, - 0x90bb, 0x90, - 0x90bc, 0x82, - 0x90bd, 0x18, - 0x90be, 0xe0, - 0x90bf, 0xb4, - 0x90c0, 0x03, - 0x90c1, 0x06, - 0x90c2, 0x90, - 0x90c3, 0xc1, - 0x90c4, 0x06, - 0x90c5, 0x74, - 0x90c6, 0x05, - 0x90c7, 0xf0, - 0x90c8, 0x90, - 0x90c9, 0xd3, - 0x90ca, 0xa0, - 0x90cb, 0x02, - 0x90cc, 0x70, - 0x90cd, 0xbf, - 0xc930, 0x72, - 0xc931, 0x21, - 0xc932, 0x81, - 0xc933, 0x3b, - 0x913b, 0x7d, - 0x913c, 0x02, - 0x913d, 0x7f, - 0x913e, 0x7b, - 0x913f, 0x02, - 0x9140, 0x72, - 0x9141, 0x25, - 0xc934, 0x28, - 0xc935, 0xae, - 0xc936, 0x80, - 0xc937, 0xd2, - 0x90d2, 0xf0, - 0x90d3, 0x90, - 0x90d4, 0xd2, - 0x90d5, 0x0a, - 0x90d6, 0x02, - 0x90d7, 0x28, - 0x90d8, 0xb4, - 0xc938, 0x28, - 0xc939, 0xb1, - 0xc93a, 0x80, - 0xc93b, 0xd9, - 0x90d9, 0x90, - 0x90da, 0x83, - 0x90db, 0xba, - 0x90dc, 0xe0, - 0x90dd, 0xff, - 0x90de, 0x90, - 0x90df, 0xd2, - 0x90e0, 0x08, - 0x90e1, 0xe0, - 0x90e2, 0xe4, - 0x90e3, 0xef, - 0x90e4, 0xf0, - 0x90e5, 0xa3, - 0x90e6, 0xe0, - 0x90e7, 0x74, - 0x90e8, 0xff, - 0x90e9, 0xf0, - 0x90ea, 0x90, - 0x90eb, 0xd2, - 0x90ec, 0x0a, - 0x90ed, 0x02, - 0x90ee, 0x28, - 0x90ef, 0xb4, - 0xc93c, 0x29, - 0xc93d, 0x79, - 0xc93e, 0x80, - 0xc93f, 0xf0, - 0x90f0, 0xf0, - 0x90f1, 0x90, - 0x90f2, 0xd2, - 0x90f3, 0x0e, - 0x90f4, 0x02, - 0x90f5, 0x29, - 0x90f6, 0x7f, - 0xc940, 0x29, - 0xc941, 0x7c, - 0xc942, 0x80, - 0xc943, 0xf7, - 0x90f7, 0x90, - 0x90f8, 0x83, - 0x90f9, 0xba, - 0x90fa, 0xe0, - 0x90fb, 0xff, - 0x90fc, 0x90, - 0x90fd, 0xd2, - 0x90fe, 0x0c, - 0x90ff, 0xe0, - 0x9100, 0xe4, - 0x9101, 0xef, - 0x9102, 0xf0, - 0x9103, 0xa3, - 0x9104, 0xe0, - 0x9105, 0x74, - 0x9106, 0xff, - 0x9107, 0xf0, - 0x9108, 0x90, - 0x9109, 0xd2, - 0x910a, 0x0e, - 0x910b, 0x02, - 0x910c, 0x29, - 0x910d, 0x7f, - 0xc944, 0x2a, - 0xc945, 0x42, - 0xc946, 0x81, - 0xc947, 0x0e, - 0x910e, 0xf0, - 0x910f, 0x90, - 0x9110, 0xd2, - 0x9111, 0x12, - 0x9112, 0x02, - 0x9113, 0x2a, - 0x9114, 0x48, - 0xc948, 0x2a, - 0xc949, 0x45, - 0xc94a, 0x81, - 0xc94b, 0x15, - 0x9115, 0x90, - 0x9116, 0x83, - 0x9117, 0xba, - 0x9118, 0xe0, - 0x9119, 0xff, - 0x911a, 0x90, - 0x911b, 0xd2, - 0x911c, 0x10, - 0x911d, 0xe0, - 0x911e, 0xe4, - 0x911f, 0xef, - 0x9120, 0xf0, - 0x9121, 0xa3, - 0x9122, 0xe0, - 0x9123, 0x74, - 0x9124, 0xff, - 0x9125, 0xf0, - 0x9126, 0x90, - 0x9127, 0xd2, - 0x9128, 0x12, - 0x9129, 0x02, - 0x912a, 0x2a, - 0x912b, 0x48, - 0xc900, 0x01, - 0x0000, 0x00, -}; - -static const u16 vs6624_p2[] = { - 0x806f, 0x01, - 0x058c, 0x01, - 0x0000, 0x00, -}; - -static const u16 vs6624_run_setup[] = { - 0x1d18, 0x00, /* Enableconstrainedwhitebalance */ - VS6624_PEAK_MIN_OUT_G_MSB, 0x3c, /* Damper PeakGain Output MSB */ - VS6624_PEAK_MIN_OUT_G_LSB, 0x66, /* Damper PeakGain Output LSB */ - VS6624_CM_LOW_THR_MSB, 0x65, /* Damper Low MSB */ - VS6624_CM_LOW_THR_LSB, 0xd1, /* Damper Low LSB */ - VS6624_CM_HIGH_THR_MSB, 0x66, /* Damper High MSB */ - VS6624_CM_HIGH_THR_LSB, 0x62, /* Damper High LSB */ - VS6624_CM_MIN_OUT_MSB, 0x00, /* Damper Min output MSB */ - VS6624_CM_MIN_OUT_LSB, 0x00, /* Damper Min output LSB */ - VS6624_NORA_DISABLE, 0x00, /* Nora fDisable */ - VS6624_NORA_USAGE, 0x04, /* Nora usage */ - VS6624_NORA_LOW_THR_MSB, 0x63, /* Damper Low MSB Changed 0x63 to 0x65 */ - VS6624_NORA_LOW_THR_LSB, 0xd1, /* Damper Low LSB */ - VS6624_NORA_HIGH_THR_MSB, 0x68, /* Damper High MSB */ - VS6624_NORA_HIGH_THR_LSB, 0xdd, /* Damper High LSB */ - VS6624_NORA_MIN_OUT_MSB, 0x3a, /* Damper Min output MSB */ - VS6624_NORA_MIN_OUT_LSB, 0x00, /* Damper Min output LSB */ - VS6624_F2B_DISABLE, 0x00, /* Disable */ - 0x1d8a, 0x30, /* MAXWeightHigh */ - 0x1d91, 0x62, /* fpDamperLowThresholdHigh MSB */ - 0x1d92, 0x4a, /* fpDamperLowThresholdHigh LSB */ - 0x1d95, 0x65, /* fpDamperHighThresholdHigh MSB */ - 0x1d96, 0x0e, /* fpDamperHighThresholdHigh LSB */ - 0x1da1, 0x3a, /* fpMinimumDamperOutputLow MSB */ - 0x1da2, 0xb8, /* fpMinimumDamperOutputLow LSB */ - 0x1e08, 0x06, /* MAXWeightLow */ - 0x1e0a, 0x0a, /* MAXWeightHigh */ - 0x1601, 0x3a, /* Red A MSB */ - 0x1602, 0x14, /* Red A LSB */ - 0x1605, 0x3b, /* Blue A MSB */ - 0x1606, 0x85, /* BLue A LSB */ - 0x1609, 0x3b, /* RED B MSB */ - 0x160a, 0x85, /* RED B LSB */ - 0x160d, 0x3a, /* Blue B MSB */ - 0x160e, 0x14, /* Blue B LSB */ - 0x1611, 0x30, /* Max Distance from Locus MSB */ - 0x1612, 0x8f, /* Max Distance from Locus MSB */ - 0x1614, 0x01, /* Enable constrainer */ - 0x0000, 0x00, -}; - -static const u16 vs6624_default[] = { - VS6624_CONTRAST0, 0x84, - VS6624_SATURATION0, 0x75, - VS6624_GAMMA0, 0x11, - VS6624_CONTRAST1, 0x84, - VS6624_SATURATION1, 0x75, - VS6624_GAMMA1, 0x11, - VS6624_MAN_RG, 0x80, - VS6624_MAN_GG, 0x80, - VS6624_MAN_BG, 0x80, - VS6624_WB_MODE, 0x1, - VS6624_EXPO_COMPENSATION, 0xfe, - VS6624_EXPO_METER, 0x0, - VS6624_LIGHT_FREQ, 0x64, - VS6624_PEAK_GAIN, 0xe, - VS6624_PEAK_LOW_THR, 0x28, - VS6624_HMIRROR0, 0x0, - VS6624_VFLIP0, 0x0, - VS6624_ZOOM_HSTEP0_MSB, 0x0, - VS6624_ZOOM_HSTEP0_LSB, 0x1, - VS6624_ZOOM_VSTEP0_MSB, 0x0, - VS6624_ZOOM_VSTEP0_LSB, 0x1, - VS6624_PAN_HSTEP0_MSB, 0x0, - VS6624_PAN_HSTEP0_LSB, 0xf, - VS6624_PAN_VSTEP0_MSB, 0x0, - VS6624_PAN_VSTEP0_LSB, 0xf, - VS6624_SENSOR_MODE, 0x1, - VS6624_SYNC_CODE_SETUP, 0x21, - VS6624_DISABLE_FR_DAMPER, 0x0, - VS6624_FR_DEN, 0x1, - VS6624_FR_NUM_LSB, 0xf, - VS6624_INIT_PIPE_SETUP, 0x0, - VS6624_IMG_FMT0, 0x0, - VS6624_YUV_SETUP, 0x1, - VS6624_IMAGE_SIZE0, 0x2, - 0x0000, 0x00, -}; - -static inline struct vs6624 *to_vs6624(struct v4l2_subdev *sd) -{ - return container_of(sd, struct vs6624, sd); -} -static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl) -{ - return &container_of(ctrl->handler, struct vs6624, hdl)->sd; -} - -#ifdef CONFIG_VIDEO_ADV_DEBUG -static int vs6624_read(struct v4l2_subdev *sd, u16 index) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - u8 buf[2]; - - buf[0] = index >> 8; - buf[1] = index; - i2c_master_send(client, buf, 2); - i2c_master_recv(client, buf, 1); - - return buf[0]; -} -#endif - -static int vs6624_write(struct v4l2_subdev *sd, u16 index, - u8 value) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - u8 buf[3]; - - buf[0] = index >> 8; - buf[1] = index; - buf[2] = value; - - return i2c_master_send(client, buf, 3); -} - -static int vs6624_writeregs(struct v4l2_subdev *sd, const u16 *regs) -{ - u16 reg; - u8 data; - - while (*regs != 0x00) { - reg = *regs++; - data = *regs++; - - vs6624_write(sd, reg, data); - } - return 0; -} - -static int vs6624_s_ctrl(struct v4l2_ctrl *ctrl) -{ - struct v4l2_subdev *sd = to_sd(ctrl); - - switch (ctrl->id) { - case V4L2_CID_CONTRAST: - vs6624_write(sd, VS6624_CONTRAST0, ctrl->val); - break; - case V4L2_CID_SATURATION: - vs6624_write(sd, VS6624_SATURATION0, ctrl->val); - break; - case V4L2_CID_HFLIP: - vs6624_write(sd, VS6624_HMIRROR0, ctrl->val); - break; - case V4L2_CID_VFLIP: - vs6624_write(sd, VS6624_VFLIP0, ctrl->val); - break; - default: - return -EINVAL; - } - - return 0; -} - -static int vs6624_enum_mbus_code(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_mbus_code_enum *code) -{ - if (code->pad || code->index >= ARRAY_SIZE(vs6624_formats)) - return -EINVAL; - - code->code = vs6624_formats[code->index].mbus_code; - return 0; -} - -static int vs6624_set_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct v4l2_mbus_framefmt *fmt = &format->format; - struct vs6624 *sensor = to_vs6624(sd); - int index; - - if (format->pad) - return -EINVAL; - - for (index = 0; index < ARRAY_SIZE(vs6624_formats); index++) - if (vs6624_formats[index].mbus_code == fmt->code) - break; - if (index >= ARRAY_SIZE(vs6624_formats)) { - /* default to first format */ - index = 0; - fmt->code = vs6624_formats[0].mbus_code; - } - - /* sensor mode is VGA */ - if (fmt->width > VGA_WIDTH) - fmt->width = VGA_WIDTH; - if (fmt->height > VGA_HEIGHT) - fmt->height = VGA_HEIGHT; - fmt->width = fmt->width & (~3); - fmt->height = fmt->height & (~3); - fmt->field = V4L2_FIELD_NONE; - fmt->colorspace = vs6624_formats[index].colorspace; - - if (format->which == V4L2_SUBDEV_FORMAT_TRY) { - cfg->try_fmt = *fmt; - return 0; - } - - /* set image format */ - switch (fmt->code) { - case MEDIA_BUS_FMT_UYVY8_2X8: - vs6624_write(sd, VS6624_IMG_FMT0, 0x0); - vs6624_write(sd, VS6624_YUV_SETUP, 0x1); - break; - case MEDIA_BUS_FMT_YUYV8_2X8: - vs6624_write(sd, VS6624_IMG_FMT0, 0x0); - vs6624_write(sd, VS6624_YUV_SETUP, 0x3); - break; - case MEDIA_BUS_FMT_RGB565_2X8_LE: - vs6624_write(sd, VS6624_IMG_FMT0, 0x4); - vs6624_write(sd, VS6624_RGB_SETUP, 0x0); - break; - default: - return -EINVAL; - } - - /* set image size */ - if ((fmt->width == VGA_WIDTH) && (fmt->height == VGA_HEIGHT)) - vs6624_write(sd, VS6624_IMAGE_SIZE0, 0x2); - else if ((fmt->width == QVGA_WIDTH) && (fmt->height == QVGA_HEIGHT)) - vs6624_write(sd, VS6624_IMAGE_SIZE0, 0x4); - else if ((fmt->width == QQVGA_WIDTH) && (fmt->height == QQVGA_HEIGHT)) - vs6624_write(sd, VS6624_IMAGE_SIZE0, 0x6); - else if ((fmt->width == CIF_WIDTH) && (fmt->height == CIF_HEIGHT)) - vs6624_write(sd, VS6624_IMAGE_SIZE0, 0x3); - else if ((fmt->width == QCIF_WIDTH) && (fmt->height == QCIF_HEIGHT)) - vs6624_write(sd, VS6624_IMAGE_SIZE0, 0x5); - else if ((fmt->width == QQCIF_WIDTH) && (fmt->height == QQCIF_HEIGHT)) - vs6624_write(sd, VS6624_IMAGE_SIZE0, 0x7); - else { - vs6624_write(sd, VS6624_IMAGE_SIZE0, 0x8); - vs6624_write(sd, VS6624_MAN_HSIZE0_MSB, fmt->width >> 8); - vs6624_write(sd, VS6624_MAN_HSIZE0_LSB, fmt->width & 0xFF); - vs6624_write(sd, VS6624_MAN_VSIZE0_MSB, fmt->height >> 8); - vs6624_write(sd, VS6624_MAN_VSIZE0_LSB, fmt->height & 0xFF); - vs6624_write(sd, VS6624_CROP_CTRL0, 0x1); - } - - sensor->fmt = *fmt; - - return 0; -} - -static int vs6624_get_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct vs6624 *sensor = to_vs6624(sd); - - if (format->pad) - return -EINVAL; - - format->format = sensor->fmt; - return 0; -} - -static int vs6624_g_frame_interval(struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *ival) -{ - struct vs6624 *sensor = to_vs6624(sd); - - ival->interval.numerator = sensor->frame_rate.denominator; - ival->interval.denominator = sensor->frame_rate.numerator; - return 0; -} - -static int vs6624_s_frame_interval(struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *ival) -{ - struct vs6624 *sensor = to_vs6624(sd); - struct v4l2_fract *tpf = &ival->interval; - - - if (tpf->numerator == 0 || tpf->denominator == 0 - || (tpf->denominator > tpf->numerator * MAX_FRAME_RATE)) { - /* reset to max frame rate */ - tpf->numerator = 1; - tpf->denominator = MAX_FRAME_RATE; - } - sensor->frame_rate.numerator = tpf->denominator; - sensor->frame_rate.denominator = tpf->numerator; - vs6624_write(sd, VS6624_DISABLE_FR_DAMPER, 0x0); - vs6624_write(sd, VS6624_FR_NUM_MSB, - sensor->frame_rate.numerator >> 8); - vs6624_write(sd, VS6624_FR_NUM_LSB, - sensor->frame_rate.numerator & 0xFF); - vs6624_write(sd, VS6624_FR_DEN, - sensor->frame_rate.denominator & 0xFF); - return 0; -} - -static int vs6624_s_stream(struct v4l2_subdev *sd, int enable) -{ - if (enable) - vs6624_write(sd, VS6624_USER_CMD, 0x2); - else - vs6624_write(sd, VS6624_USER_CMD, 0x4); - udelay(100); - return 0; -} - -#ifdef CONFIG_VIDEO_ADV_DEBUG -static int vs6624_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg) -{ - reg->val = vs6624_read(sd, reg->reg & 0xffff); - reg->size = 1; - return 0; -} - -static int vs6624_s_register(struct v4l2_subdev *sd, const struct v4l2_dbg_register *reg) -{ - vs6624_write(sd, reg->reg & 0xffff, reg->val & 0xff); - return 0; -} -#endif - -static const struct v4l2_ctrl_ops vs6624_ctrl_ops = { - .s_ctrl = vs6624_s_ctrl, -}; - -static const struct v4l2_subdev_core_ops vs6624_core_ops = { -#ifdef CONFIG_VIDEO_ADV_DEBUG - .g_register = vs6624_g_register, - .s_register = vs6624_s_register, -#endif -}; - -static const struct v4l2_subdev_video_ops vs6624_video_ops = { - .s_frame_interval = vs6624_s_frame_interval, - .g_frame_interval = vs6624_g_frame_interval, - .s_stream = vs6624_s_stream, -}; - -static const struct v4l2_subdev_pad_ops vs6624_pad_ops = { - .enum_mbus_code = vs6624_enum_mbus_code, - .get_fmt = vs6624_get_fmt, - .set_fmt = vs6624_set_fmt, -}; - -static const struct v4l2_subdev_ops vs6624_ops = { - .core = &vs6624_core_ops, - .video = &vs6624_video_ops, - .pad = &vs6624_pad_ops, -}; - -static int vs6624_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct vs6624 *sensor; - struct v4l2_subdev *sd; - struct v4l2_ctrl_handler *hdl; - const unsigned *ce; - int ret; - - /* Check if the adapter supports the needed features */ - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) - return -EIO; - - ce = client->dev.platform_data; - if (ce == NULL) - return -EINVAL; - - ret = devm_gpio_request_one(&client->dev, *ce, GPIOF_OUT_INIT_HIGH, - "VS6624 Chip Enable"); - if (ret) { - v4l_err(client, "failed to request GPIO %d\n", *ce); - return ret; - } - /* wait 100ms before any further i2c writes are performed */ - msleep(100); - - sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL); - if (sensor == NULL) - return -ENOMEM; - - sd = &sensor->sd; - v4l2_i2c_subdev_init(sd, client, &vs6624_ops); - - vs6624_writeregs(sd, vs6624_p1); - vs6624_write(sd, VS6624_MICRO_EN, 0x2); - vs6624_write(sd, VS6624_DIO_EN, 0x1); - usleep_range(10000, 11000); - vs6624_writeregs(sd, vs6624_p2); - - vs6624_writeregs(sd, vs6624_default); - vs6624_write(sd, VS6624_HSYNC_SETUP, 0xF); - vs6624_writeregs(sd, vs6624_run_setup); - - /* set frame rate */ - sensor->frame_rate.numerator = MAX_FRAME_RATE; - sensor->frame_rate.denominator = 1; - vs6624_write(sd, VS6624_DISABLE_FR_DAMPER, 0x0); - vs6624_write(sd, VS6624_FR_NUM_MSB, - sensor->frame_rate.numerator >> 8); - vs6624_write(sd, VS6624_FR_NUM_LSB, - sensor->frame_rate.numerator & 0xFF); - vs6624_write(sd, VS6624_FR_DEN, - sensor->frame_rate.denominator & 0xFF); - - sensor->fmt = vs6624_default_fmt; - sensor->ce_pin = *ce; - - v4l_info(client, "chip found @ 0x%02x (%s)\n", - client->addr << 1, client->adapter->name); - - hdl = &sensor->hdl; - v4l2_ctrl_handler_init(hdl, 4); - v4l2_ctrl_new_std(hdl, &vs6624_ctrl_ops, - V4L2_CID_CONTRAST, 0, 0xFF, 1, 0x87); - v4l2_ctrl_new_std(hdl, &vs6624_ctrl_ops, - V4L2_CID_SATURATION, 0, 0xFF, 1, 0x78); - v4l2_ctrl_new_std(hdl, &vs6624_ctrl_ops, - V4L2_CID_HFLIP, 0, 1, 1, 0); - v4l2_ctrl_new_std(hdl, &vs6624_ctrl_ops, - V4L2_CID_VFLIP, 0, 1, 1, 0); - /* hook the control handler into the driver */ - sd->ctrl_handler = hdl; - if (hdl->error) { - int err = hdl->error; - - v4l2_ctrl_handler_free(hdl); - return err; - } - - /* initialize the hardware to the default control values */ - ret = v4l2_ctrl_handler_setup(hdl); - if (ret) - v4l2_ctrl_handler_free(hdl); - return ret; -} - -static int vs6624_remove(struct i2c_client *client) -{ - struct v4l2_subdev *sd = i2c_get_clientdata(client); - - v4l2_device_unregister_subdev(sd); - v4l2_ctrl_handler_free(sd->ctrl_handler); - return 0; -} - -static const struct i2c_device_id vs6624_id[] = { - {"vs6624", 0}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, vs6624_id); - -static struct i2c_driver vs6624_driver = { - .driver = { - .name = "vs6624", - }, - .probe = vs6624_probe, - .remove = vs6624_remove, - .id_table = vs6624_id, -}; - -module_i2c_driver(vs6624_driver); - -MODULE_DESCRIPTION("VS6624 sensor driver"); -MODULE_AUTHOR("Scott Jiang <Scott.Jiang.Linux@gmail.com>"); -MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/usb/dvb-usb/af9005-script.h b/drivers/media/usb/dvb-usb/af9005-script.h deleted file mode 100644 index 870cb59cd904..000000000000 --- a/drivers/media/usb/dvb-usb/af9005-script.h +++ /dev/null @@ -1,204 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* -File automatically generated by createinit.py using data -extracted from AF05BDA.sys (windows driver): - -dd if=AF05BDA.sys of=initsequence bs=1 skip=88316 count=1110 -python createinit.py > af9005-script.h - -*/ - -typedef struct { - u16 reg; - u8 pos; - u8 len; - u8 val; -} RegDesc; - -static RegDesc script[] = { - {0xa180, 0x0, 0x8, 0xa}, - {0xa181, 0x0, 0x8, 0xd7}, - {0xa182, 0x0, 0x8, 0xa3}, - {0xa0a0, 0x0, 0x8, 0x0}, - {0xa0a1, 0x0, 0x5, 0x0}, - {0xa0a1, 0x5, 0x1, 0x1}, - {0xa0c0, 0x0, 0x4, 0x1}, - {0xa20e, 0x4, 0x4, 0xa}, - {0xa20f, 0x0, 0x8, 0x40}, - {0xa210, 0x0, 0x8, 0x8}, - {0xa32a, 0x0, 0x4, 0xa}, - {0xa32c, 0x0, 0x8, 0x20}, - {0xa32b, 0x0, 0x8, 0x15}, - {0xa1a0, 0x1, 0x1, 0x1}, - {0xa000, 0x0, 0x1, 0x1}, - {0xa000, 0x1, 0x1, 0x0}, - {0xa001, 0x1, 0x1, 0x1}, - {0xa001, 0x0, 0x1, 0x0}, - {0xa001, 0x5, 0x1, 0x0}, - {0xa00e, 0x0, 0x5, 0x10}, - {0xa00f, 0x0, 0x3, 0x4}, - {0xa00f, 0x3, 0x3, 0x5}, - {0xa010, 0x0, 0x3, 0x4}, - {0xa010, 0x3, 0x3, 0x5}, - {0xa016, 0x4, 0x4, 0x3}, - {0xa01f, 0x0, 0x6, 0xa}, - {0xa020, 0x0, 0x6, 0xa}, - {0xa2bc, 0x0, 0x1, 0x1}, - {0xa2bc, 0x5, 0x1, 0x1}, - {0xa015, 0x0, 0x8, 0x50}, - {0xa016, 0x0, 0x1, 0x0}, - {0xa02a, 0x0, 0x8, 0x50}, - {0xa029, 0x0, 0x8, 0x4b}, - {0xa614, 0x0, 0x8, 0x46}, - {0xa002, 0x0, 0x5, 0x19}, - {0xa003, 0x0, 0x5, 0x1a}, - {0xa004, 0x0, 0x5, 0x19}, - {0xa005, 0x0, 0x5, 0x1a}, - {0xa008, 0x0, 0x8, 0x69}, - {0xa009, 0x0, 0x2, 0x2}, - {0xae1b, 0x0, 0x8, 0x69}, - {0xae1c, 0x0, 0x8, 0x2}, - {0xae1d, 0x0, 0x8, 0x2a}, - {0xa022, 0x0, 0x8, 0xaa}, - {0xa006, 0x0, 0x8, 0xc8}, - {0xa007, 0x0, 0x2, 0x0}, - {0xa00c, 0x0, 0x8, 0xba}, - {0xa00d, 0x0, 0x2, 0x2}, - {0xa608, 0x0, 0x8, 0xba}, - {0xa60e, 0x0, 0x2, 0x2}, - {0xa609, 0x0, 0x8, 0x80}, - {0xa60e, 0x2, 0x2, 0x3}, - {0xa00a, 0x0, 0x8, 0xb6}, - {0xa00b, 0x0, 0x2, 0x0}, - {0xa011, 0x0, 0x8, 0xb9}, - {0xa012, 0x0, 0x2, 0x0}, - {0xa013, 0x0, 0x8, 0xbd}, - {0xa014, 0x0, 0x2, 0x2}, - {0xa366, 0x0, 0x1, 0x1}, - {0xa2bc, 0x3, 0x1, 0x0}, - {0xa2bd, 0x0, 0x8, 0xa}, - {0xa2be, 0x0, 0x8, 0x14}, - {0xa2bf, 0x0, 0x8, 0x8}, - {0xa60a, 0x0, 0x8, 0xbd}, - {0xa60e, 0x4, 0x2, 0x2}, - {0xa60b, 0x0, 0x8, 0x86}, - {0xa60e, 0x6, 0x2, 0x3}, - {0xa001, 0x2, 0x2, 0x1}, - {0xa1c7, 0x0, 0x8, 0xf5}, - {0xa03d, 0x0, 0x8, 0xb1}, - {0xa616, 0x0, 0x8, 0xff}, - {0xa617, 0x0, 0x8, 0xad}, - {0xa618, 0x0, 0x8, 0xad}, - {0xa61e, 0x3, 0x1, 0x1}, - {0xae1a, 0x0, 0x8, 0x0}, - {0xae19, 0x0, 0x8, 0xc8}, - {0xae18, 0x0, 0x8, 0x61}, - {0xa140, 0x0, 0x8, 0x0}, - {0xa141, 0x0, 0x8, 0xc8}, - {0xa142, 0x0, 0x7, 0x61}, - {0xa023, 0x0, 0x8, 0xff}, - {0xa021, 0x0, 0x8, 0xad}, - {0xa026, 0x0, 0x1, 0x0}, - {0xa024, 0x0, 0x8, 0xff}, - {0xa025, 0x0, 0x8, 0xff}, - {0xa1c8, 0x0, 0x8, 0xf}, - {0xa2bc, 0x1, 0x1, 0x0}, - {0xa60c, 0x0, 0x4, 0x5}, - {0xa60c, 0x4, 0x4, 0x6}, - {0xa60d, 0x0, 0x8, 0xa}, - {0xa371, 0x0, 0x1, 0x1}, - {0xa366, 0x1, 0x3, 0x7}, - {0xa338, 0x0, 0x8, 0x10}, - {0xa339, 0x0, 0x6, 0x7}, - {0xa33a, 0x0, 0x6, 0x1f}, - {0xa33b, 0x0, 0x8, 0xf6}, - {0xa33c, 0x3, 0x5, 0x4}, - {0xa33d, 0x4, 0x4, 0x0}, - {0xa33d, 0x1, 0x1, 0x1}, - {0xa33d, 0x2, 0x1, 0x1}, - {0xa33d, 0x3, 0x1, 0x1}, - {0xa16d, 0x0, 0x4, 0xf}, - {0xa161, 0x0, 0x5, 0x5}, - {0xa162, 0x0, 0x4, 0x5}, - {0xa165, 0x0, 0x8, 0xff}, - {0xa166, 0x0, 0x8, 0x9c}, - {0xa2c3, 0x0, 0x4, 0x5}, - {0xa61a, 0x0, 0x6, 0xf}, - {0xb200, 0x0, 0x8, 0xa1}, - {0xb201, 0x0, 0x8, 0x7}, - {0xa093, 0x0, 0x1, 0x0}, - {0xa093, 0x1, 0x5, 0xf}, - {0xa094, 0x0, 0x8, 0xff}, - {0xa095, 0x0, 0x8, 0xf}, - {0xa080, 0x2, 0x5, 0x3}, - {0xa081, 0x0, 0x4, 0x0}, - {0xa081, 0x4, 0x4, 0x9}, - {0xa082, 0x0, 0x5, 0x1f}, - {0xa08d, 0x0, 0x8, 0x1}, - {0xa083, 0x0, 0x8, 0x32}, - {0xa084, 0x0, 0x1, 0x0}, - {0xa08e, 0x0, 0x8, 0x3}, - {0xa085, 0x0, 0x8, 0x32}, - {0xa086, 0x0, 0x3, 0x0}, - {0xa087, 0x0, 0x8, 0x6e}, - {0xa088, 0x0, 0x5, 0x15}, - {0xa089, 0x0, 0x8, 0x0}, - {0xa08a, 0x0, 0x5, 0x19}, - {0xa08b, 0x0, 0x8, 0x92}, - {0xa08c, 0x0, 0x5, 0x1c}, - {0xa120, 0x0, 0x8, 0x0}, - {0xa121, 0x0, 0x5, 0x10}, - {0xa122, 0x0, 0x8, 0x0}, - {0xa123, 0x0, 0x7, 0x40}, - {0xa123, 0x7, 0x1, 0x0}, - {0xa124, 0x0, 0x8, 0x13}, - {0xa125, 0x0, 0x7, 0x10}, - {0xa1c0, 0x0, 0x8, 0x0}, - {0xa1c1, 0x0, 0x5, 0x4}, - {0xa1c2, 0x0, 0x8, 0x0}, - {0xa1c3, 0x0, 0x5, 0x10}, - {0xa1c3, 0x5, 0x3, 0x0}, - {0xa1c4, 0x0, 0x6, 0x0}, - {0xa1c5, 0x0, 0x7, 0x10}, - {0xa100, 0x0, 0x8, 0x0}, - {0xa101, 0x0, 0x5, 0x10}, - {0xa102, 0x0, 0x8, 0x0}, - {0xa103, 0x0, 0x7, 0x40}, - {0xa103, 0x7, 0x1, 0x0}, - {0xa104, 0x0, 0x8, 0x18}, - {0xa105, 0x0, 0x7, 0xa}, - {0xa106, 0x0, 0x8, 0x20}, - {0xa107, 0x0, 0x8, 0x40}, - {0xa108, 0x0, 0x4, 0x0}, - {0xa38c, 0x0, 0x8, 0xfc}, - {0xa38d, 0x0, 0x8, 0x0}, - {0xa38e, 0x0, 0x8, 0x7e}, - {0xa38f, 0x0, 0x8, 0x0}, - {0xa390, 0x0, 0x8, 0x2f}, - {0xa60f, 0x5, 0x1, 0x1}, - {0xa170, 0x0, 0x8, 0xdc}, - {0xa171, 0x0, 0x2, 0x0}, - {0xa2ae, 0x0, 0x1, 0x1}, - {0xa2ae, 0x1, 0x1, 0x1}, - {0xa392, 0x0, 0x1, 0x1}, - {0xa391, 0x2, 0x1, 0x0}, - {0xabc1, 0x0, 0x8, 0xff}, - {0xabc2, 0x0, 0x8, 0x0}, - {0xabc8, 0x0, 0x8, 0x8}, - {0xabca, 0x0, 0x8, 0x10}, - {0xabcb, 0x0, 0x1, 0x0}, - {0xabc3, 0x5, 0x3, 0x7}, - {0xabc0, 0x6, 0x1, 0x0}, - {0xabc0, 0x4, 0x2, 0x0}, - {0xa344, 0x4, 0x4, 0x1}, - {0xabc0, 0x7, 0x1, 0x1}, - {0xabc0, 0x2, 0x1, 0x1}, - {0xa345, 0x0, 0x8, 0x66}, - {0xa346, 0x0, 0x8, 0x66}, - {0xa347, 0x0, 0x4, 0x0}, - {0xa343, 0x0, 0x4, 0xa}, - {0xa347, 0x4, 0x4, 0x2}, - {0xa348, 0x0, 0x4, 0xc}, - {0xa348, 0x4, 0x4, 0x7}, - {0xa349, 0x0, 0x6, 0x2}, -}; diff --git a/drivers/net/appletalk/cops.c b/drivers/net/appletalk/cops.c deleted file mode 100644 index 6b12ce822e51..000000000000 --- a/drivers/net/appletalk/cops.c +++ /dev/null @@ -1,1005 +0,0 @@ -/* cops.c: LocalTalk driver for Linux. - * - * Authors: - * - Jay Schulist <jschlst@samba.org> - * - * With more than a little help from; - * - Alan Cox <alan@lxorguk.ukuu.org.uk> - * - * Derived from: - * - skeleton.c: A network driver outline for linux. - * Written 1993-94 by Donald Becker. - * - ltpc.c: A driver for the LocalTalk PC card. - * Written by Bradford W. Johnson. - * - * Copyright 1993 United States Government as represented by the - * Director, National Security Agency. - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - * - * Changes: - * 19970608 Alan Cox Allowed dual card type support - * Can set board type in insmod - * Hooks for cops_setup routine - * (not yet implemented). - * 19971101 Jay Schulist Fixes for multiple lt* devices. - * 19980607 Steven Hirsch Fixed the badly broken support - * for Tangent type cards. Only - * tested on Daystar LT200. Some - * cleanup of formatting and program - * logic. Added emacs 'local-vars' - * setup for Jay's brace style. - * 20000211 Alan Cox Cleaned up for softnet - */ - -static const char *version = -"cops.c:v0.04 6/7/98 Jay Schulist <jschlst@samba.org>\n"; -/* - * Sources: - * COPS Localtalk SDK. This provides almost all of the information - * needed. - */ - -/* - * insmod/modprobe configurable stuff. - * - IO Port, choose one your card supports or 0 if you dare. - * - IRQ, also choose one your card supports or nothing and let - * the driver figure it out. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/types.h> -#include <linux/fcntl.h> -#include <linux/interrupt.h> -#include <linux/ptrace.h> -#include <linux/ioport.h> -#include <linux/in.h> -#include <linux/string.h> -#include <linux/errno.h> -#include <linux/init.h> -#include <linux/netdevice.h> -#include <linux/etherdevice.h> -#include <linux/skbuff.h> -#include <linux/if_arp.h> -#include <linux/if_ltalk.h> -#include <linux/delay.h> /* For udelay() */ -#include <linux/atalk.h> -#include <linux/spinlock.h> -#include <linux/bitops.h> -#include <linux/jiffies.h> - -#include <net/Space.h> - -#include <asm/io.h> -#include <asm/dma.h> - -#include "cops.h" /* Our Stuff */ -#include "cops_ltdrv.h" /* Firmware code for Tangent type cards. */ -#include "cops_ffdrv.h" /* Firmware code for Dayna type cards. */ - -/* - * The name of the card. Is used for messages and in the requests for - * io regions, irqs and dma channels - */ - -static const char *cardname = "cops"; - -#ifdef CONFIG_COPS_DAYNA -static int board_type = DAYNA; /* Module exported */ -#else -static int board_type = TANGENT; -#endif - -static int io = 0x240; /* Default IO for Dayna */ -static int irq = 5; /* Default IRQ */ - -/* - * COPS Autoprobe information. - * Right now if port address is right but IRQ is not 5 this will - * return a 5 no matter what since we will still get a status response. - * Need one more additional check to narrow down after we have gotten - * the ioaddr. But since only other possible IRQs is 3 and 4 so no real - * hurry on this. I *STRONGLY* recommend using IRQ 5 for your card with - * this driver. - * - * This driver has 2 modes and they are: Dayna mode and Tangent mode. - * Each mode corresponds with the type of card. It has been found - * that there are 2 main types of cards and all other cards are - * the same and just have different names or only have minor differences - * such as more IO ports. As this driver is tested it will - * become more clear on exactly what cards are supported. The driver - * defaults to using Dayna mode. To change the drivers mode, simply - * select Dayna or Tangent mode when configuring the kernel. - * - * This driver should support: - * TANGENT driver mode: - * Tangent ATB-II, Novell NL-1000, Daystar Digital LT-200, - * COPS LT-1 - * DAYNA driver mode: - * Dayna DL2000/DaynaTalk PC (Half Length), COPS LT-95, - * Farallon PhoneNET PC III, Farallon PhoneNET PC II - * Other cards possibly supported mode unknown though: - * Dayna DL2000 (Full length), COPS LT/M (Micro-Channel) - * - * Cards NOT supported by this driver but supported by the ltpc.c - * driver written by Bradford W. Johnson <johns393@maroon.tc.umn.edu> - * Farallon PhoneNET PC - * Original Apple LocalTalk PC card - * - * N.B. - * - * The Daystar Digital LT200 boards do not support interrupt-driven - * IO. You must specify 'irq=0xff' as a module parameter to invoke - * polled mode. I also believe that the port probing logic is quite - * dangerous at best and certainly hopeless for a polled card. Best to - * specify both. - Steve H. - * - */ - -/* - * Zero terminated list of IO ports to probe. - */ - -static unsigned int ports[] = { - 0x240, 0x340, 0x200, 0x210, 0x220, 0x230, 0x260, - 0x2A0, 0x300, 0x310, 0x320, 0x330, 0x350, 0x360, - 0 -}; - -/* - * Zero terminated list of IRQ ports to probe. - */ - -static int cops_irqlist[] = { - 5, 4, 3, 0 -}; - -static struct timer_list cops_timer; -static struct net_device *cops_timer_dev; - -/* use 0 for production, 1 for verification, 2 for debug, 3 for verbose debug */ -#ifndef COPS_DEBUG -#define COPS_DEBUG 1 -#endif -static unsigned int cops_debug = COPS_DEBUG; - -/* The number of low I/O ports used by the card. */ -#define COPS_IO_EXTENT 8 - -/* Information that needs to be kept for each board. */ - -struct cops_local -{ - int board; /* Holds what board type is. */ - int nodeid; /* Set to 1 once have nodeid. */ - unsigned char node_acquire; /* Node ID when acquired. */ - struct atalk_addr node_addr; /* Full node address */ - spinlock_t lock; /* RX/TX lock */ -}; - -/* Index to functions, as function prototypes. */ -static int cops_probe1 (struct net_device *dev, int ioaddr); -static int cops_irq (int ioaddr, int board); - -static int cops_open (struct net_device *dev); -static int cops_jumpstart (struct net_device *dev); -static void cops_reset (struct net_device *dev, int sleep); -static void cops_load (struct net_device *dev); -static int cops_nodeid (struct net_device *dev, int nodeid); - -static irqreturn_t cops_interrupt (int irq, void *dev_id); -static void cops_poll(struct timer_list *t); -static void cops_timeout(struct net_device *dev, unsigned int txqueue); -static void cops_rx (struct net_device *dev); -static netdev_tx_t cops_send_packet (struct sk_buff *skb, - struct net_device *dev); -static void set_multicast_list (struct net_device *dev); -static int cops_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); -static int cops_close (struct net_device *dev); - -static void cleanup_card(struct net_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - release_region(dev->base_addr, COPS_IO_EXTENT); -} - -/* - * Check for a network adaptor of this type, and return '0' iff one exists. - * If dev->base_addr == 0, probe all likely locations. - * If dev->base_addr in [1..0x1ff], always return failure. - * otherwise go with what we pass in. - */ -struct net_device * __init cops_probe(int unit) -{ - struct net_device *dev; - unsigned *port; - int base_addr; - int err = 0; - - dev = alloc_ltalkdev(sizeof(struct cops_local)); - if (!dev) - return ERR_PTR(-ENOMEM); - - if (unit >= 0) { - sprintf(dev->name, "lt%d", unit); - netdev_boot_setup_check(dev); - irq = dev->irq; - base_addr = dev->base_addr; - } else { - base_addr = dev->base_addr = io; - } - - if (base_addr > 0x1ff) { /* Check a single specified location. */ - err = cops_probe1(dev, base_addr); - } else if (base_addr != 0) { /* Don't probe at all. */ - err = -ENXIO; - } else { - /* FIXME Does this really work for cards which generate irq? - * It's definitely N.G. for polled Tangent. sh - * Dayna cards don't autoprobe well at all, but if your card is - * at IRQ 5 & IO 0x240 we find it every time. ;) JS - */ - for (port = ports; *port && cops_probe1(dev, *port) < 0; port++) - ; - if (!*port) - err = -ENODEV; - } - if (err) - goto out; - err = register_netdev(dev); - if (err) - goto out1; - return dev; -out1: - cleanup_card(dev); -out: - free_netdev(dev); - return ERR_PTR(err); -} - -static const struct net_device_ops cops_netdev_ops = { - .ndo_open = cops_open, - .ndo_stop = cops_close, - .ndo_start_xmit = cops_send_packet, - .ndo_tx_timeout = cops_timeout, - .ndo_do_ioctl = cops_ioctl, - .ndo_set_rx_mode = set_multicast_list, -}; - -/* - * This is the real probe routine. Linux has a history of friendly device - * probes on the ISA bus. A good device probes avoids doing writes, and - * verifies that the correct device exists and functions. - */ -static int __init cops_probe1(struct net_device *dev, int ioaddr) -{ - struct cops_local *lp; - static unsigned version_printed; - int board = board_type; - int retval; - - if(cops_debug && version_printed++ == 0) - printk("%s", version); - - /* Grab the region so no one else tries to probe our ioports. */ - if (!request_region(ioaddr, COPS_IO_EXTENT, dev->name)) - return -EBUSY; - - /* - * Since this board has jumpered interrupts, allocate the interrupt - * vector now. There is no point in waiting since no other device - * can use the interrupt, and this marks the irq as busy. Jumpered - * interrupts are typically not reported by the boards, and we must - * used AutoIRQ to find them. - */ - dev->irq = irq; - switch (dev->irq) - { - case 0: - /* COPS AutoIRQ routine */ - dev->irq = cops_irq(ioaddr, board); - if (dev->irq) - break; - fallthrough; /* Once no IRQ found on this port */ - case 1: - retval = -EINVAL; - goto err_out; - - /* Fixup for users that don't know that IRQ 2 is really - * IRQ 9, or don't know which one to set. - */ - case 2: - dev->irq = 9; - break; - - /* Polled operation requested. Although irq of zero passed as - * a parameter tells the init routines to probe, we'll - * overload it to denote polled operation at runtime. - */ - case 0xff: - dev->irq = 0; - break; - - default: - break; - } - - dev->base_addr = ioaddr; - - /* Reserve any actual interrupt. */ - if (dev->irq) { - retval = request_irq(dev->irq, cops_interrupt, 0, dev->name, dev); - if (retval) - goto err_out; - } - - lp = netdev_priv(dev); - spin_lock_init(&lp->lock); - - /* Copy local board variable to lp struct. */ - lp->board = board; - - dev->netdev_ops = &cops_netdev_ops; - dev->watchdog_timeo = HZ * 2; - - - /* Tell the user where the card is and what mode we're in. */ - if(board==DAYNA) - printk("%s: %s at %#3x, using IRQ %d, in Dayna mode.\n", - dev->name, cardname, ioaddr, dev->irq); - if(board==TANGENT) { - if(dev->irq) - printk("%s: %s at %#3x, IRQ %d, in Tangent mode\n", - dev->name, cardname, ioaddr, dev->irq); - else - printk("%s: %s at %#3x, using polled IO, in Tangent mode.\n", - dev->name, cardname, ioaddr); - - } - return 0; - -err_out: - release_region(ioaddr, COPS_IO_EXTENT); - return retval; -} - -static int __init cops_irq (int ioaddr, int board) -{ /* - * This does not use the IRQ to determine where the IRQ is. We just - * assume that when we get a correct status response that it's the IRQ. - * This really just verifies the IO port but since we only have access - * to such a small number of IRQs (5, 4, 3) this is not bad. - * This will probably not work for more than one card. - */ - int irqaddr=0; - int i, x, status; - - if(board==DAYNA) - { - outb(0, ioaddr+DAYNA_RESET); - inb(ioaddr+DAYNA_RESET); - mdelay(333); - } - if(board==TANGENT) - { - inb(ioaddr); - outb(0, ioaddr); - outb(0, ioaddr+TANG_RESET); - } - - for(i=0; cops_irqlist[i] !=0; i++) - { - irqaddr = cops_irqlist[i]; - for(x = 0xFFFF; x>0; x --) /* wait for response */ - { - if(board==DAYNA) - { - status = (inb(ioaddr+DAYNA_CARD_STATUS)&3); - if(status == 1) - return irqaddr; - } - if(board==TANGENT) - { - if((inb(ioaddr+TANG_CARD_STATUS)& TANG_TX_READY) !=0) - return irqaddr; - } - } - } - return 0; /* no IRQ found */ -} - -/* - * Open/initialize the board. This is called (in the current kernel) - * sometime after booting when the 'ifconfig' program is run. - */ -static int cops_open(struct net_device *dev) -{ - struct cops_local *lp = netdev_priv(dev); - - if(dev->irq==0) - { - /* - * I don't know if the Dayna-style boards support polled - * operation. For now, only allow it for Tangent. - */ - if(lp->board==TANGENT) /* Poll 20 times per second */ - { - cops_timer_dev = dev; - timer_setup(&cops_timer, cops_poll, 0); - cops_timer.expires = jiffies + HZ/20; - add_timer(&cops_timer); - } - else - { - printk(KERN_WARNING "%s: No irq line set\n", dev->name); - return -EAGAIN; - } - } - - cops_jumpstart(dev); /* Start the card up. */ - - netif_start_queue(dev); - return 0; -} - -/* - * This allows for a dynamic start/restart of the entire card. - */ -static int cops_jumpstart(struct net_device *dev) -{ - struct cops_local *lp = netdev_priv(dev); - - /* - * Once the card has the firmware loaded and has acquired - * the nodeid, if it is reset it will lose it all. - */ - cops_reset(dev,1); /* Need to reset card before load firmware. */ - cops_load(dev); /* Load the firmware. */ - - /* - * If atalkd already gave us a nodeid we will use that - * one again, else we wait for atalkd to give us a nodeid - * in cops_ioctl. This may cause a problem if someone steals - * our nodeid while we are resetting. - */ - if(lp->nodeid == 1) - cops_nodeid(dev,lp->node_acquire); - - return 0; -} - -static void tangent_wait_reset(int ioaddr) -{ - int timeout=0; - - while(timeout++ < 5 && (inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY)==0) - mdelay(1); /* Wait 1 second */ -} - -/* - * Reset the LocalTalk board. - */ -static void cops_reset(struct net_device *dev, int sleep) -{ - struct cops_local *lp = netdev_priv(dev); - int ioaddr=dev->base_addr; - - if(lp->board==TANGENT) - { - inb(ioaddr); /* Clear request latch. */ - outb(0,ioaddr); /* Clear the TANG_TX_READY flop. */ - outb(0, ioaddr+TANG_RESET); /* Reset the adapter. */ - - tangent_wait_reset(ioaddr); - outb(0, ioaddr+TANG_CLEAR_INT); - } - if(lp->board==DAYNA) - { - outb(0, ioaddr+DAYNA_RESET); /* Assert the reset port */ - inb(ioaddr+DAYNA_RESET); /* Clear the reset */ - if (sleep) - msleep(333); - else - mdelay(333); - } - - netif_wake_queue(dev); -} - -static void cops_load (struct net_device *dev) -{ - struct ifreq ifr; - struct ltfirmware *ltf= (struct ltfirmware *)&ifr.ifr_ifru; - struct cops_local *lp = netdev_priv(dev); - int ioaddr=dev->base_addr; - int length, i = 0; - - strcpy(ifr.ifr_name,"lt0"); - - /* Get card's firmware code and do some checks on it. */ -#ifdef CONFIG_COPS_DAYNA - if(lp->board==DAYNA) - { - ltf->length=sizeof(ffdrv_code); - ltf->data=ffdrv_code; - } - else -#endif -#ifdef CONFIG_COPS_TANGENT - if(lp->board==TANGENT) - { - ltf->length=sizeof(ltdrv_code); - ltf->data=ltdrv_code; - } - else -#endif - { - printk(KERN_INFO "%s; unsupported board type.\n", dev->name); - return; - } - - /* Check to make sure firmware is correct length. */ - if(lp->board==DAYNA && ltf->length!=5983) - { - printk(KERN_WARNING "%s: Firmware is not length of FFDRV.BIN.\n", dev->name); - return; - } - if(lp->board==TANGENT && ltf->length!=2501) - { - printk(KERN_WARNING "%s: Firmware is not length of DRVCODE.BIN.\n", dev->name); - return; - } - - if(lp->board==DAYNA) - { - /* - * We must wait for a status response - * with the DAYNA board. - */ - while(++i<65536) - { - if((inb(ioaddr+DAYNA_CARD_STATUS)&3)==1) - break; - } - - if(i==65536) - return; - } - - /* - * Upload the firmware and kick. Byte-by-byte works nicely here. - */ - i=0; - length = ltf->length; - while(length--) - { - outb(ltf->data[i], ioaddr); - i++; - } - - if(cops_debug > 1) - printk("%s: Uploaded firmware - %d bytes of %d bytes.\n", - dev->name, i, ltf->length); - - if(lp->board==DAYNA) /* Tell Dayna to run the firmware code. */ - outb(1, ioaddr+DAYNA_INT_CARD); - else /* Tell Tang to run the firmware code. */ - inb(ioaddr); - - if(lp->board==TANGENT) - { - tangent_wait_reset(ioaddr); - inb(ioaddr); /* Clear initial ready signal. */ - } -} - -/* - * Get the LocalTalk Nodeid from the card. We can suggest - * any nodeid 1-254. The card will try and get that exact - * address else we can specify 0 as the nodeid and the card - * will autoprobe for a nodeid. - */ -static int cops_nodeid (struct net_device *dev, int nodeid) -{ - struct cops_local *lp = netdev_priv(dev); - int ioaddr = dev->base_addr; - - if(lp->board == DAYNA) - { - /* Empty any pending adapter responses. */ - while((inb(ioaddr+DAYNA_CARD_STATUS)&DAYNA_TX_READY)==0) - { - outb(0, ioaddr+COPS_CLEAR_INT); /* Clear interrupts. */ - if((inb(ioaddr+DAYNA_CARD_STATUS)&0x03)==DAYNA_RX_REQUEST) - cops_rx(dev); /* Kick any packets waiting. */ - schedule(); - } - - outb(2, ioaddr); /* Output command packet length as 2. */ - outb(0, ioaddr); - outb(LAP_INIT, ioaddr); /* Send LAP_INIT command byte. */ - outb(nodeid, ioaddr); /* Suggest node address. */ - } - - if(lp->board == TANGENT) - { - /* Empty any pending adapter responses. */ - while(inb(ioaddr+TANG_CARD_STATUS)&TANG_RX_READY) - { - outb(0, ioaddr+COPS_CLEAR_INT); /* Clear interrupt. */ - cops_rx(dev); /* Kick out packets waiting. */ - schedule(); - } - - /* Not sure what Tangent does if nodeid picked is used. */ - if(nodeid == 0) /* Seed. */ - nodeid = jiffies&0xFF; /* Get a random try */ - outb(2, ioaddr); /* Command length LSB */ - outb(0, ioaddr); /* Command length MSB */ - outb(LAP_INIT, ioaddr); /* Send LAP_INIT byte */ - outb(nodeid, ioaddr); /* LAP address hint. */ - outb(0xFF, ioaddr); /* Int. level to use */ - } - - lp->node_acquire=0; /* Set nodeid holder to 0. */ - while(lp->node_acquire==0) /* Get *True* nodeid finally. */ - { - outb(0, ioaddr+COPS_CLEAR_INT); /* Clear any interrupt. */ - - if(lp->board == DAYNA) - { - if((inb(ioaddr+DAYNA_CARD_STATUS)&0x03)==DAYNA_RX_REQUEST) - cops_rx(dev); /* Grab the nodeid put in lp->node_acquire. */ - } - if(lp->board == TANGENT) - { - if(inb(ioaddr+TANG_CARD_STATUS)&TANG_RX_READY) - cops_rx(dev); /* Grab the nodeid put in lp->node_acquire. */ - } - schedule(); - } - - if(cops_debug > 1) - printk(KERN_DEBUG "%s: Node ID %d has been acquired.\n", - dev->name, lp->node_acquire); - - lp->nodeid=1; /* Set got nodeid to 1. */ - - return 0; -} - -/* - * Poll the Tangent type cards to see if we have work. - */ - -static void cops_poll(struct timer_list *unused) -{ - int ioaddr, status; - int boguscount = 0; - struct net_device *dev = cops_timer_dev; - - del_timer(&cops_timer); - - if(dev == NULL) - return; /* We've been downed */ - - ioaddr = dev->base_addr; - do { - status=inb(ioaddr+TANG_CARD_STATUS); - if(status & TANG_RX_READY) - cops_rx(dev); - if(status & TANG_TX_READY) - netif_wake_queue(dev); - status = inb(ioaddr+TANG_CARD_STATUS); - } while((++boguscount < 20) && (status&(TANG_RX_READY|TANG_TX_READY))); - - /* poll 20 times per second */ - cops_timer.expires = jiffies + HZ/20; - add_timer(&cops_timer); -} - -/* - * The typical workload of the driver: - * Handle the network interface interrupts. - */ -static irqreturn_t cops_interrupt(int irq, void *dev_id) -{ - struct net_device *dev = dev_id; - struct cops_local *lp; - int ioaddr, status; - int boguscount = 0; - - ioaddr = dev->base_addr; - lp = netdev_priv(dev); - - if(lp->board==DAYNA) - { - do { - outb(0, ioaddr + COPS_CLEAR_INT); - status=inb(ioaddr+DAYNA_CARD_STATUS); - if((status&0x03)==DAYNA_RX_REQUEST) - cops_rx(dev); - netif_wake_queue(dev); - } while(++boguscount < 20); - } - else - { - do { - status=inb(ioaddr+TANG_CARD_STATUS); - if(status & TANG_RX_READY) - cops_rx(dev); - if(status & TANG_TX_READY) - netif_wake_queue(dev); - status=inb(ioaddr+TANG_CARD_STATUS); - } while((++boguscount < 20) && (status&(TANG_RX_READY|TANG_TX_READY))); - } - - return IRQ_HANDLED; -} - -/* - * We have a good packet(s), get it/them out of the buffers. - */ -static void cops_rx(struct net_device *dev) -{ - int pkt_len = 0; - int rsp_type = 0; - struct sk_buff *skb = NULL; - struct cops_local *lp = netdev_priv(dev); - int ioaddr = dev->base_addr; - int boguscount = 0; - unsigned long flags; - - - spin_lock_irqsave(&lp->lock, flags); - - if(lp->board==DAYNA) - { - outb(0, ioaddr); /* Send out Zero length. */ - outb(0, ioaddr); - outb(DATA_READ, ioaddr); /* Send read command out. */ - - /* Wait for DMA to turn around. */ - while(++boguscount<1000000) - { - barrier(); - if((inb(ioaddr+DAYNA_CARD_STATUS)&0x03)==DAYNA_RX_READY) - break; - } - - if(boguscount==1000000) - { - printk(KERN_WARNING "%s: DMA timed out.\n",dev->name); - spin_unlock_irqrestore(&lp->lock, flags); - return; - } - } - - /* Get response length. */ - pkt_len = inb(ioaddr); - pkt_len |= (inb(ioaddr) << 8); - /* Input IO code. */ - rsp_type=inb(ioaddr); - - /* Malloc up new buffer. */ - skb = dev_alloc_skb(pkt_len); - if(skb == NULL) - { - printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", - dev->name); - dev->stats.rx_dropped++; - while(pkt_len--) /* Discard packet */ - inb(ioaddr); - spin_unlock_irqrestore(&lp->lock, flags); - return; - } - skb->dev = dev; - skb_put(skb, pkt_len); - skb->protocol = htons(ETH_P_LOCALTALK); - - insb(ioaddr, skb->data, pkt_len); /* Eat the Data */ - - if(lp->board==DAYNA) - outb(1, ioaddr+DAYNA_INT_CARD); /* Interrupt the card */ - - spin_unlock_irqrestore(&lp->lock, flags); /* Restore interrupts. */ - - /* Check for bad response length */ - if(pkt_len < 0 || pkt_len > MAX_LLAP_SIZE) - { - printk(KERN_WARNING "%s: Bad packet length of %d bytes.\n", - dev->name, pkt_len); - dev->stats.tx_errors++; - dev_kfree_skb_any(skb); - return; - } - - /* Set nodeid and then get out. */ - if(rsp_type == LAP_INIT_RSP) - { /* Nodeid taken from received packet. */ - lp->node_acquire = skb->data[0]; - dev_kfree_skb_any(skb); - return; - } - - /* One last check to make sure we have a good packet. */ - if(rsp_type != LAP_RESPONSE) - { - printk(KERN_WARNING "%s: Bad packet type %d.\n", dev->name, rsp_type); - dev->stats.tx_errors++; - dev_kfree_skb_any(skb); - return; - } - - skb_reset_mac_header(skb); /* Point to entire packet. */ - skb_pull(skb,3); - skb_reset_transport_header(skb); /* Point to data (Skip header). */ - - /* Update the counters. */ - dev->stats.rx_packets++; - dev->stats.rx_bytes += skb->len; - - /* Send packet to a higher place. */ - netif_rx(skb); -} - -static void cops_timeout(struct net_device *dev, unsigned int txqueue) -{ - struct cops_local *lp = netdev_priv(dev); - int ioaddr = dev->base_addr; - - dev->stats.tx_errors++; - if(lp->board==TANGENT) - { - if((inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY)==0) - printk(KERN_WARNING "%s: No TX complete interrupt.\n", dev->name); - } - printk(KERN_WARNING "%s: Transmit timed out.\n", dev->name); - cops_jumpstart(dev); /* Restart the card. */ - netif_trans_update(dev); /* prevent tx timeout */ - netif_wake_queue(dev); -} - - -/* - * Make the card transmit a LocalTalk packet. - */ - -static netdev_tx_t cops_send_packet(struct sk_buff *skb, - struct net_device *dev) -{ - struct cops_local *lp = netdev_priv(dev); - int ioaddr = dev->base_addr; - unsigned long flags; - - /* - * Block a timer-based transmit from overlapping. - */ - - netif_stop_queue(dev); - - spin_lock_irqsave(&lp->lock, flags); - if(lp->board == DAYNA) /* Wait for adapter transmit buffer. */ - while((inb(ioaddr+DAYNA_CARD_STATUS)&DAYNA_TX_READY)==0) - cpu_relax(); - if(lp->board == TANGENT) /* Wait for adapter transmit buffer. */ - while((inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY)==0) - cpu_relax(); - - /* Output IO length. */ - outb(skb->len, ioaddr); - outb(skb->len >> 8, ioaddr); - - /* Output IO code. */ - outb(LAP_WRITE, ioaddr); - - if(lp->board == DAYNA) /* Check the transmit buffer again. */ - while((inb(ioaddr+DAYNA_CARD_STATUS)&DAYNA_TX_READY)==0); - - outsb(ioaddr, skb->data, skb->len); /* Send out the data. */ - - if(lp->board==DAYNA) /* Dayna requires you kick the card */ - outb(1, ioaddr+DAYNA_INT_CARD); - - spin_unlock_irqrestore(&lp->lock, flags); /* Restore interrupts. */ - - /* Done sending packet, update counters and cleanup. */ - dev->stats.tx_packets++; - dev->stats.tx_bytes += skb->len; - dev_kfree_skb (skb); - return NETDEV_TX_OK; -} - -/* - * Dummy function to keep the Appletalk layer happy. - */ - -static void set_multicast_list(struct net_device *dev) -{ - if(cops_debug >= 3) - printk("%s: set_multicast_list executed\n", dev->name); -} - -/* - * System ioctls for the COPS LocalTalk card. - */ - -static int cops_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - struct cops_local *lp = netdev_priv(dev); - struct sockaddr_at *sa = (struct sockaddr_at *)&ifr->ifr_addr; - struct atalk_addr *aa = &lp->node_addr; - - switch(cmd) - { - case SIOCSIFADDR: - /* Get and set the nodeid and network # atalkd wants. */ - cops_nodeid(dev, sa->sat_addr.s_node); - aa->s_net = sa->sat_addr.s_net; - aa->s_node = lp->node_acquire; - - /* Set broardcast address. */ - dev->broadcast[0] = 0xFF; - - /* Set hardware address. */ - dev->dev_addr[0] = aa->s_node; - dev->addr_len = 1; - return 0; - - case SIOCGIFADDR: - sa->sat_addr.s_net = aa->s_net; - sa->sat_addr.s_node = aa->s_node; - return 0; - - default: - return -EOPNOTSUPP; - } -} - -/* - * The inverse routine to cops_open(). - */ - -static int cops_close(struct net_device *dev) -{ - struct cops_local *lp = netdev_priv(dev); - - /* If we were running polled, yank the timer. - */ - if(lp->board==TANGENT && dev->irq==0) - del_timer(&cops_timer); - - netif_stop_queue(dev); - return 0; -} - - -#ifdef MODULE -static struct net_device *cops_dev; - -MODULE_LICENSE("GPL"); -module_param_hw(io, int, ioport, 0); -module_param_hw(irq, int, irq, 0); -module_param_hw(board_type, int, other, 0); - -static int __init cops_module_init(void) -{ - if (io == 0) - printk(KERN_WARNING "%s: You shouldn't autoprobe with insmod\n", - cardname); - cops_dev = cops_probe(-1); - return PTR_ERR_OR_ZERO(cops_dev); -} - -static void __exit cops_module_exit(void) -{ - unregister_netdev(cops_dev); - cleanup_card(cops_dev); - free_netdev(cops_dev); -} -module_init(cops_module_init); -module_exit(cops_module_exit); -#endif /* MODULE */ diff --git a/drivers/net/appletalk/cops.h b/drivers/net/appletalk/cops.h deleted file mode 100644 index 7a0bfb351929..000000000000 --- a/drivers/net/appletalk/cops.h +++ /dev/null @@ -1,61 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* cops.h: LocalTalk driver for Linux. - * - * Authors: - * - Jay Schulist <jschlst@samba.org> - */ - -#ifndef __LINUX_COPSLTALK_H -#define __LINUX_COPSLTALK_H - -#ifdef __KERNEL__ - -/* Max LLAP size we will accept. */ -#define MAX_LLAP_SIZE 603 - -/* Tangent */ -#define TANG_CARD_STATUS 1 -#define TANG_CLEAR_INT 1 -#define TANG_RESET 3 - -#define TANG_TX_READY 1 -#define TANG_RX_READY 2 - -/* Dayna */ -#define DAYNA_CMD_DATA 0 -#define DAYNA_CLEAR_INT 1 -#define DAYNA_CARD_STATUS 2 -#define DAYNA_INT_CARD 3 -#define DAYNA_RESET 4 - -#define DAYNA_RX_READY 0 -#define DAYNA_TX_READY 1 -#define DAYNA_RX_REQUEST 3 - -/* Same on both card types */ -#define COPS_CLEAR_INT 1 - -/* LAP response codes received from the cards. */ -#define LAP_INIT 1 /* Init cmd */ -#define LAP_INIT_RSP 2 /* Init response */ -#define LAP_WRITE 3 /* Write cmd */ -#define DATA_READ 4 /* Data read */ -#define LAP_RESPONSE 4 /* Received ALAP frame response */ -#define LAP_GETSTAT 5 /* Get LAP and HW status */ -#define LAP_RSPSTAT 6 /* Status response */ - -#endif - -/* - * Structure to hold the firmware information. - */ -struct ltfirmware -{ - unsigned int length; - const unsigned char *data; -}; - -#define DAYNA 1 -#define TANGENT 2 - -#endif diff --git a/drivers/net/appletalk/cops_ffdrv.h b/drivers/net/appletalk/cops_ffdrv.h deleted file mode 100644 index b02005087c1b..000000000000 --- a/drivers/net/appletalk/cops_ffdrv.h +++ /dev/null @@ -1,532 +0,0 @@ - -/* - * The firmware this driver downloads into the Localtalk card is a - * separate program and is not GPL'd source code, even though the Linux - * side driver and the routine that loads this data into the card are. - * - * It is taken from the COPS SDK and is under the following license - * - * This material is licensed to you strictly for use in conjunction with - * the use of COPS LocalTalk adapters. - * There is no charge for this SDK. And no waranty express or implied - * about its fitness for any purpose. However, we will cheerefully - * refund every penny you paid for this SDK... - * Regards, - * - * Thomas F. Divine - * Chief Scientist - */ - - -/* cops_ffdrv.h: LocalTalk driver firmware dump for Linux. - * - * Authors: - * - Jay Schulist <jschlst@samba.org> - */ - - -#ifdef CONFIG_COPS_DAYNA - -static const unsigned char ffdrv_code[] = { - 58,3,0,50,228,149,33,255,255,34,226,149, - 249,17,40,152,33,202,154,183,237,82,77,68, - 11,107,98,19,54,0,237,176,175,50,80,0, - 62,128,237,71,62,32,237,57,51,62,12,237, - 57,50,237,57,54,62,6,237,57,52,62,12, - 237,57,49,33,107,137,34,32,128,33,83,130, - 34,40,128,33,86,130,34,42,128,33,112,130, - 34,36,128,33,211,130,34,38,128,62,0,237, - 57,16,33,63,148,34,34,128,237,94,205,15, - 130,251,205,168,145,24,141,67,111,112,121,114, - 105,103,104,116,32,40,67,41,32,49,57,56, - 56,32,45,32,68,97,121,110,97,32,67,111, - 109,109,117,110,105,99,97,116,105,111,110,115, - 32,32,32,65,108,108,32,114,105,103,104,116, - 115,32,114,101,115,101,114,118,101,100,46,32, - 32,40,68,40,68,7,16,8,34,7,22,6, - 16,5,12,4,8,3,6,140,0,16,39,128, - 0,4,96,10,224,6,0,7,126,2,64,11, - 118,12,6,13,0,14,193,15,0,5,96,3, - 192,1,64,9,8,62,9,211,66,62,192,211, - 66,62,100,61,32,253,6,28,33,205,129,14, - 66,237,163,194,253,129,6,28,33,205,129,14, - 64,237,163,194,9,130,201,62,47,50,71,152, - 62,47,211,68,58,203,129,237,57,20,58,204, - 129,237,57,21,33,77,152,54,132,205,233,129, - 58,228,149,254,209,40,6,56,4,62,0,24, - 2,219,96,33,233,149,119,230,62,33,232,149, - 119,213,33,8,152,17,7,0,25,119,19,25, - 119,209,201,251,237,77,245,197,213,229,221,229, - 205,233,129,62,1,50,106,137,205,158,139,221, - 225,225,209,193,241,251,237,77,245,197,213,219, - 72,237,56,16,230,46,237,57,16,237,56,12, - 58,72,152,183,32,26,6,20,17,128,2,237, - 56,46,187,32,35,237,56,47,186,32,29,219, - 72,230,1,32,3,5,32,232,175,50,72,152, - 229,221,229,62,1,50,106,137,205,158,139,221, - 225,225,24,25,62,1,50,72,152,58,201,129, - 237,57,12,58,202,129,237,57,13,237,56,16, - 246,17,237,57,16,209,193,241,251,237,77,245, - 197,229,213,221,229,237,56,16,230,17,237,57, - 16,237,56,20,58,34,152,246,16,246,8,211, - 68,62,6,61,32,253,58,34,152,246,8,211, - 68,58,203,129,237,57,20,58,204,129,237,57, - 21,237,56,16,246,34,237,57,16,221,225,209, - 225,193,241,251,237,77,33,2,0,57,126,230, - 3,237,100,1,40,2,246,128,230,130,245,62, - 5,211,64,241,211,64,201,229,213,243,237,56, - 16,230,46,237,57,16,237,56,12,251,70,35, - 35,126,254,175,202,77,133,254,129,202,15,133, - 230,128,194,191,132,43,58,44,152,119,33,76, - 152,119,35,62,132,119,120,254,255,40,4,58, - 49,152,119,219,72,43,43,112,17,3,0,237, - 56,52,230,248,237,57,52,219,72,230,1,194, - 141,131,209,225,237,56,52,246,6,237,57,52, - 62,1,55,251,201,62,3,211,66,62,192,211, - 66,62,48,211,66,0,0,219,66,230,1,40, - 4,219,67,24,240,205,203,135,58,75,152,254, - 255,202,128,132,58,49,152,254,161,250,207,131, - 58,34,152,211,68,62,10,211,66,62,128,211, - 66,62,11,211,66,62,6,211,66,24,0,62, - 14,211,66,62,33,211,66,62,1,211,66,62, - 64,211,66,62,3,211,66,62,209,211,66,62, - 100,71,219,66,230,1,32,6,5,32,247,195, - 248,132,219,67,71,58,44,152,184,194,248,132, - 62,100,71,219,66,230,1,32,6,5,32,247, - 195,248,132,219,67,62,100,71,219,66,230,1, - 32,6,5,32,247,195,248,132,219,67,254,133, - 32,7,62,0,50,74,152,24,17,254,173,32, - 7,62,1,50,74,152,24,6,254,141,194,248, - 132,71,209,225,58,49,152,254,132,32,10,62, - 50,205,2,134,205,144,135,24,27,254,140,32, - 15,62,110,205,2,134,62,141,184,32,5,205, - 144,135,24,8,62,10,205,2,134,205,8,134, - 62,1,50,106,137,205,158,139,237,56,52,246, - 6,237,57,52,175,183,251,201,62,20,135,237, - 57,20,175,237,57,21,237,56,16,246,2,237, - 57,16,237,56,20,95,237,56,21,123,254,10, - 48,244,237,56,16,230,17,237,57,16,209,225, - 205,144,135,62,1,50,106,137,205,158,139,237, - 56,52,246,6,237,57,52,175,183,251,201,209, - 225,243,219,72,230,1,40,13,62,10,211,66, - 0,0,219,66,230,192,202,226,132,237,56,52, - 246,6,237,57,52,62,1,55,251,201,205,203, - 135,62,1,50,106,137,205,158,139,237,56,52, - 246,6,237,57,52,183,251,201,209,225,62,1, - 50,106,137,205,158,139,237,56,52,246,6,237, - 57,52,62,2,55,251,201,209,225,243,219,72, - 230,1,202,213,132,62,10,211,66,0,0,219, - 66,230,192,194,213,132,229,62,1,50,106,137, - 42,40,152,205,65,143,225,17,3,0,205,111, - 136,62,6,211,66,58,44,152,211,66,237,56, - 52,246,6,237,57,52,183,251,201,209,197,237, - 56,52,230,248,237,57,52,219,72,230,1,32, - 15,193,225,237,56,52,246,6,237,57,52,62, - 1,55,251,201,14,23,58,37,152,254,0,40, - 14,14,2,254,1,32,5,62,140,119,24,3, - 62,132,119,43,43,197,205,203,135,193,62,1, - 211,66,62,64,211,66,62,3,211,66,62,193, - 211,66,62,100,203,39,71,219,66,230,1,32, - 6,5,32,247,195,229,133,33,238,151,219,67, - 71,58,44,152,184,194,229,133,119,62,100,71, - 219,66,230,1,32,6,5,32,247,195,229,133, - 219,67,35,119,13,32,234,193,225,62,1,50, - 106,137,205,158,139,237,56,52,246,6,237,57, - 52,175,183,251,201,33,234,151,35,35,62,255, - 119,193,225,62,1,50,106,137,205,158,139,237, - 56,52,246,6,237,57,52,175,251,201,243,61, - 32,253,251,201,62,3,211,66,62,192,211,66, - 58,49,152,254,140,32,19,197,229,213,17,181, - 129,33,185,129,1,2,0,237,176,209,225,193, - 24,27,229,213,33,187,129,58,49,152,230,15, - 87,30,2,237,92,25,17,181,129,126,18,19, - 35,126,18,209,225,58,34,152,246,8,211,68, - 58,49,152,254,165,40,14,254,164,40,10,62, - 10,211,66,62,224,211,66,24,25,58,74,152, - 254,0,40,10,62,10,211,66,62,160,211,66, - 24,8,62,10,211,66,62,128,211,66,62,11, - 211,66,62,6,211,66,205,147,143,62,5,211, - 66,62,224,211,66,62,5,211,66,62,96,211, - 66,62,5,61,32,253,62,5,211,66,62,224, - 211,66,62,14,61,32,253,62,5,211,66,62, - 233,211,66,62,128,211,66,58,181,129,61,32, - 253,62,1,211,66,62,192,211,66,1,254,19, - 237,56,46,187,32,6,13,32,247,195,226,134, - 62,192,211,66,0,0,219,66,203,119,40,250, - 219,66,203,87,40,250,243,237,56,16,230,17, - 237,57,16,237,56,20,251,62,5,211,66,62, - 224,211,66,58,182,129,61,32,253,229,33,181, - 129,58,183,129,203,63,119,35,58,184,129,119, - 225,62,10,211,66,62,224,211,66,62,11,211, - 66,62,118,211,66,62,47,211,68,62,5,211, - 66,62,233,211,66,58,181,129,61,32,253,62, - 5,211,66,62,224,211,66,58,182,129,61,32, - 253,62,5,211,66,62,96,211,66,201,229,213, - 58,50,152,230,15,87,30,2,237,92,33,187, - 129,25,17,181,129,126,18,35,19,126,18,209, - 225,58,71,152,246,8,211,68,58,50,152,254, - 165,40,14,254,164,40,10,62,10,211,66,62, - 224,211,66,24,8,62,10,211,66,62,128,211, - 66,62,11,211,66,62,6,211,66,195,248,135, - 62,3,211,66,62,192,211,66,197,229,213,17, - 181,129,33,183,129,1,2,0,237,176,209,225, - 193,62,47,211,68,62,10,211,66,62,224,211, - 66,62,11,211,66,62,118,211,66,62,1,211, - 66,62,0,211,66,205,147,143,195,16,136,62, - 3,211,66,62,192,211,66,197,229,213,17,181, - 129,33,183,129,1,2,0,237,176,209,225,193, - 62,47,211,68,62,10,211,66,62,224,211,66, - 62,11,211,66,62,118,211,66,205,147,143,62, - 5,211,66,62,224,211,66,62,5,211,66,62, - 96,211,66,62,5,61,32,253,62,5,211,66, - 62,224,211,66,62,14,61,32,253,62,5,211, - 66,62,233,211,66,62,128,211,66,58,181,129, - 61,32,253,62,1,211,66,62,192,211,66,1, - 254,19,237,56,46,187,32,6,13,32,247,195, - 88,136,62,192,211,66,0,0,219,66,203,119, - 40,250,219,66,203,87,40,250,62,5,211,66, - 62,224,211,66,58,182,129,61,32,253,62,5, - 211,66,62,96,211,66,201,197,14,67,6,0, - 62,3,211,66,62,192,211,66,62,48,211,66, - 0,0,219,66,230,1,40,4,219,67,24,240, - 62,5,211,66,62,233,211,66,62,128,211,66, - 58,181,129,61,32,253,237,163,29,62,192,211, - 66,219,66,230,4,40,250,237,163,29,32,245, - 219,66,230,4,40,250,62,255,71,219,66,230, - 4,40,3,5,32,247,219,66,230,4,40,250, - 62,5,211,66,62,224,211,66,58,182,129,61, - 32,253,62,5,211,66,62,96,211,66,58,71, - 152,254,1,202,18,137,62,16,211,66,62,56, - 211,66,62,14,211,66,62,33,211,66,62,1, - 211,66,62,248,211,66,237,56,48,246,153,230, - 207,237,57,48,62,3,211,66,62,221,211,66, - 193,201,58,71,152,211,68,62,10,211,66,62, - 128,211,66,62,11,211,66,62,6,211,66,62, - 6,211,66,58,44,152,211,66,62,16,211,66, - 62,56,211,66,62,48,211,66,0,0,62,14, - 211,66,62,33,211,66,62,1,211,66,62,248, - 211,66,237,56,48,246,145,246,8,230,207,237, - 57,48,62,3,211,66,62,221,211,66,193,201, - 44,3,1,0,70,69,1,245,197,213,229,175, - 50,72,152,237,56,16,230,46,237,57,16,237, - 56,12,62,1,211,66,0,0,219,66,95,230, - 160,32,3,195,20,139,123,230,96,194,72,139, - 62,48,211,66,62,1,211,66,62,64,211,66, - 237,91,40,152,205,207,143,25,43,55,237,82, - 218,70,139,34,42,152,98,107,58,44,152,190, - 194,210,138,35,35,62,130,190,194,200,137,62, - 1,50,48,152,62,175,190,202,82,139,62,132, - 190,32,44,50,50,152,62,47,50,71,152,229, - 175,50,106,137,42,40,152,205,65,143,225,54, - 133,43,70,58,44,152,119,43,112,17,3,0, - 62,10,205,2,134,205,111,136,195,158,138,62, - 140,190,32,19,50,50,152,58,233,149,230,4, - 202,222,138,62,1,50,71,152,195,219,137,126, - 254,160,250,185,138,254,166,242,185,138,50,50, - 152,43,126,35,229,213,33,234,149,95,22,0, - 25,126,254,132,40,18,254,140,40,14,58,50, - 152,230,15,87,126,31,21,242,65,138,56,2, - 175,119,58,50,152,230,15,87,58,233,149,230, - 62,31,21,242,85,138,218,98,138,209,225,195, - 20,139,58,50,152,33,100,137,230,15,95,22, - 0,25,126,50,71,152,209,225,58,50,152,254, - 164,250,135,138,58,73,152,254,0,40,4,54, - 173,24,2,54,133,43,70,58,44,152,119,43, - 112,17,3,0,205,70,135,175,50,106,137,205, - 208,139,58,199,129,237,57,12,58,200,129,237, - 57,13,237,56,16,246,17,237,57,16,225,209, - 193,241,251,237,77,62,129,190,194,227,138,54, - 130,43,70,58,44,152,119,43,112,17,3,0, - 205,144,135,195,20,139,35,35,126,254,132,194, - 227,138,175,50,106,137,205,158,139,24,42,58, - 201,154,254,1,40,7,62,1,50,106,137,24, - 237,58,106,137,254,1,202,222,138,62,128,166, - 194,222,138,221,229,221,33,67,152,205,127,142, - 205,109,144,221,225,225,209,193,241,251,237,77, - 58,106,137,254,1,202,44,139,58,50,152,254, - 164,250,44,139,58,73,152,238,1,50,73,152, - 221,229,221,33,51,152,205,127,142,221,225,62, - 1,50,106,137,205,158,139,195,13,139,24,208, - 24,206,24,204,230,64,40,3,195,20,139,195, - 20,139,43,126,33,8,152,119,35,58,44,152, - 119,43,237,91,35,152,205,203,135,205,158,139, - 195,13,139,175,50,78,152,62,3,211,66,62, - 192,211,66,201,197,33,4,0,57,126,35,102, - 111,62,1,50,106,137,219,72,205,141,139,193, - 201,62,1,50,78,152,34,40,152,54,0,35, - 35,54,0,195,163,139,58,78,152,183,200,229, - 33,181,129,58,183,129,119,35,58,184,129,119, - 225,62,47,211,68,62,14,211,66,62,193,211, - 66,62,10,211,66,62,224,211,66,62,11,211, - 66,62,118,211,66,195,3,140,58,78,152,183, - 200,58,71,152,211,68,254,69,40,4,254,70, - 32,17,58,73,152,254,0,40,10,62,10,211, - 66,62,160,211,66,24,8,62,10,211,66,62, - 128,211,66,62,11,211,66,62,6,211,66,62, - 6,211,66,58,44,152,211,66,62,16,211,66, - 62,56,211,66,62,48,211,66,0,0,219,66, - 230,1,40,4,219,67,24,240,62,14,211,66, - 62,33,211,66,42,40,152,205,65,143,62,1, - 211,66,62,248,211,66,237,56,48,246,145,246, - 8,230,207,237,57,48,62,3,211,66,62,221, - 211,66,201,62,16,211,66,62,56,211,66,62, - 48,211,66,0,0,219,66,230,1,40,4,219, - 67,24,240,62,14,211,66,62,33,211,66,62, - 1,211,66,62,248,211,66,237,56,48,246,153, - 230,207,237,57,48,62,3,211,66,62,221,211, - 66,201,229,213,33,234,149,95,22,0,25,126, - 254,132,40,4,254,140,32,2,175,119,123,209, - 225,201,6,8,14,0,31,48,1,12,16,250, - 121,201,33,4,0,57,94,35,86,33,2,0, - 57,126,35,102,111,221,229,34,89,152,237,83, - 91,152,221,33,63,152,205,127,142,58,81,152, - 50,82,152,58,80,152,135,50,80,152,205,162, - 140,254,3,56,16,58,81,152,135,60,230,15, - 50,81,152,175,50,80,152,24,23,58,79,152, - 205,162,140,254,3,48,13,58,81,152,203,63, - 50,81,152,62,255,50,79,152,58,81,152,50, - 82,152,58,79,152,135,50,79,152,62,32,50, - 83,152,50,84,152,237,56,16,230,17,237,57, - 16,219,72,62,192,50,93,152,62,93,50,94, - 152,58,93,152,61,50,93,152,32,9,58,94, - 152,61,50,94,152,40,44,62,170,237,57,20, - 175,237,57,21,237,56,16,246,2,237,57,16, - 219,72,230,1,202,29,141,237,56,20,71,237, - 56,21,120,254,10,48,237,237,56,16,230,17, - 237,57,16,243,62,14,211,66,62,65,211,66, - 251,58,39,152,23,23,60,50,39,152,71,58, - 82,152,160,230,15,40,22,71,14,10,219,66, - 230,16,202,186,141,219,72,230,1,202,186,141, - 13,32,239,16,235,42,89,152,237,91,91,152, - 205,47,131,48,7,61,202,186,141,195,227,141, - 221,225,33,0,0,201,221,33,55,152,205,127, - 142,58,84,152,61,50,84,152,40,19,58,82, - 152,246,1,50,82,152,58,79,152,246,1,50, - 79,152,195,29,141,221,225,33,1,0,201,221, - 33,59,152,205,127,142,58,80,152,246,1,50, - 80,152,58,82,152,135,246,1,50,82,152,58, - 83,152,61,50,83,152,194,29,141,221,225,33, - 2,0,201,221,229,33,0,0,57,17,4,0, - 25,126,50,44,152,230,128,50,85,152,58,85, - 152,183,40,6,221,33,88,2,24,4,221,33, - 150,0,58,44,152,183,40,53,60,40,50,60, - 40,47,61,61,33,86,152,119,35,119,35,54, - 129,175,50,48,152,221,43,221,229,225,124,181, - 40,42,33,86,152,17,3,0,205,189,140,17, - 232,3,27,123,178,32,251,58,48,152,183,40, - 224,58,44,152,71,62,7,128,230,127,71,58, - 85,152,176,50,44,152,24,162,221,225,201,183, - 221,52,0,192,221,52,1,192,221,52,2,192, - 221,52,3,192,55,201,245,62,1,211,100,241, - 201,245,62,1,211,96,241,201,33,2,0,57, - 126,35,102,111,237,56,48,230,175,237,57,48, - 62,48,237,57,49,125,237,57,32,124,237,57, - 33,62,0,237,57,34,62,88,237,57,35,62, - 0,237,57,36,237,57,37,33,128,2,125,237, - 57,38,124,237,57,39,237,56,48,246,97,230, - 207,237,57,48,62,0,237,57,0,62,0,211, - 96,211,100,201,33,2,0,57,126,35,102,111, - 237,56,48,230,175,237,57,48,62,12,237,57, - 49,62,76,237,57,32,62,0,237,57,33,237, - 57,34,125,237,57,35,124,237,57,36,62,0, - 237,57,37,33,128,2,125,237,57,38,124,237, - 57,39,237,56,48,246,97,230,207,237,57,48, - 62,1,211,96,201,33,2,0,57,126,35,102, - 111,229,237,56,48,230,87,237,57,48,125,237, - 57,40,124,237,57,41,62,0,237,57,42,62, - 67,237,57,43,62,0,237,57,44,58,106,137, - 254,1,32,5,33,6,0,24,3,33,128,2, - 125,237,57,46,124,237,57,47,237,56,50,230, - 252,246,2,237,57,50,225,201,33,4,0,57, - 94,35,86,33,2,0,57,126,35,102,111,237, - 56,48,230,87,237,57,48,125,237,57,40,124, - 237,57,41,62,0,237,57,42,62,67,237,57, - 43,62,0,237,57,44,123,237,57,46,122,237, - 57,47,237,56,50,230,244,246,0,237,57,50, - 237,56,48,246,145,230,207,237,57,48,201,213, - 237,56,46,95,237,56,47,87,237,56,46,111, - 237,56,47,103,183,237,82,32,235,33,128,2, - 183,237,82,209,201,213,237,56,38,95,237,56, - 39,87,237,56,38,111,237,56,39,103,183,237, - 82,32,235,33,128,2,183,237,82,209,201,245, - 197,1,52,0,237,120,230,253,237,121,193,241, - 201,245,197,1,52,0,237,120,246,2,237,121, - 193,241,201,33,2,0,57,126,35,102,111,126, - 35,110,103,201,33,0,0,34,102,152,34,96, - 152,34,98,152,33,202,154,34,104,152,237,91, - 104,152,42,226,149,183,237,82,17,0,255,25, - 34,100,152,203,124,40,6,33,0,125,34,100, - 152,42,104,152,35,35,35,229,205,120,139,193, - 201,205,186,149,229,42,40,152,35,35,35,229, - 205,39,144,193,124,230,3,103,221,117,254,221, - 116,255,237,91,42,152,35,35,35,183,237,82, - 32,12,17,5,0,42,42,152,205,171,149,242, - 169,144,42,40,152,229,205,120,139,193,195,198, - 149,237,91,42,152,42,98,152,25,34,98,152, - 19,19,19,42,102,152,25,34,102,152,237,91, - 100,152,33,158,253,25,237,91,102,152,205,171, - 149,242,214,144,33,0,0,34,102,152,62,1, - 50,95,152,205,225,144,195,198,149,58,95,152, - 183,200,237,91,96,152,42,102,152,205,171,149, - 242,5,145,237,91,102,152,33,98,2,25,237, - 91,96,152,205,171,149,250,37,145,237,91,96, - 152,42,102,152,183,237,82,32,7,42,98,152, - 125,180,40,13,237,91,102,152,42,96,152,205, - 171,149,242,58,145,237,91,104,152,42,102,152, - 25,35,35,35,229,205,120,139,193,175,50,95, - 152,201,195,107,139,205,206,149,250,255,243,205, - 225,144,251,58,230,149,183,194,198,149,17,1, - 0,42,98,152,205,171,149,250,198,149,62,1, - 50,230,149,237,91,96,152,42,104,152,25,221, - 117,252,221,116,253,237,91,104,152,42,96,152, - 25,35,35,35,221,117,254,221,116,255,35,35, - 35,229,205,39,144,124,230,3,103,35,35,35, - 221,117,250,221,116,251,235,221,110,252,221,102, - 253,115,35,114,35,54,4,62,1,211,100,211, - 84,195,198,149,33,0,0,34,102,152,34,96, - 152,34,98,152,33,202,154,34,104,152,237,91, - 104,152,42,226,149,183,237,82,17,0,255,25, - 34,100,152,33,109,152,54,0,33,107,152,229, - 205,240,142,193,62,47,50,34,152,62,132,50, - 49,152,205,241,145,205,61,145,58,39,152,60, - 50,39,152,24,241,205,206,149,251,255,33,109, - 152,126,183,202,198,149,110,221,117,251,33,109, - 152,54,0,221,126,251,254,1,40,28,254,3, - 40,101,254,4,202,190,147,254,5,202,147,147, - 254,8,40,87,33,107,152,229,205,240,142,195, - 198,149,58,201,154,183,32,21,33,111,152,126, - 50,229,149,205,52,144,33,110,152,110,38,0, - 229,205,11,142,193,237,91,96,152,42,104,152, - 25,221,117,254,221,116,255,35,35,54,2,17, - 2,0,43,43,115,35,114,58,44,152,35,35, - 119,58,228,149,35,119,62,1,211,100,211,84, - 62,1,50,201,154,24,169,205,153,142,58,231, - 149,183,40,250,175,50,231,149,33,110,152,126, - 254,255,40,91,58,233,149,230,63,183,40,83, - 94,22,0,33,234,149,25,126,183,40,13,33, - 110,152,94,33,234,150,25,126,254,3,32,36, - 205,81,148,125,180,33,110,152,94,22,0,40, - 17,33,234,149,25,54,0,33,107,152,229,205, - 240,142,193,195,198,149,33,234,150,25,54,0, - 33,110,152,94,22,0,33,234,149,25,126,50, - 49,152,254,132,32,37,62,47,50,34,152,42, - 107,152,229,33,110,152,229,205,174,140,193,193, - 125,180,33,110,152,94,22,0,33,234,150,202, - 117,147,25,52,195,120,147,58,49,152,254,140, - 32,7,62,1,50,34,152,24,210,62,32,50, - 106,152,24,19,58,49,152,95,58,106,152,163, - 183,58,106,152,32,11,203,63,50,106,152,58, - 106,152,183,32,231,254,2,40,51,254,4,40, - 38,254,8,40,26,254,16,40,13,254,32,32, - 158,62,165,50,49,152,62,69,24,190,62,164, - 50,49,152,62,70,24,181,62,163,50,49,152, - 175,24,173,62,162,50,49,152,62,1,24,164, - 62,161,50,49,152,62,3,24,155,25,54,0, - 221,126,251,254,8,40,7,58,230,149,183,202, - 32,146,33,107,152,229,205,240,142,193,211,84, - 195,198,149,237,91,96,152,42,104,152,25,221, - 117,254,221,116,255,35,35,54,6,17,2,0, - 43,43,115,35,114,58,228,149,35,35,119,58, - 233,149,35,119,205,146,142,195,32,146,237,91, - 96,152,42,104,152,25,229,205,160,142,193,58, - 231,149,183,40,250,175,50,231,149,243,237,91, - 96,152,42,104,152,25,221,117,254,221,116,255, - 78,35,70,221,113,252,221,112,253,89,80,42, - 98,152,183,237,82,34,98,152,203,124,40,19, - 33,0,0,34,98,152,34,102,152,34,96,152, - 62,1,50,95,152,24,40,221,94,252,221,86, - 253,19,19,19,42,96,152,25,34,96,152,237, - 91,100,152,33,158,253,25,237,91,96,152,205, - 171,149,242,55,148,33,0,0,34,96,152,175, - 50,230,149,251,195,32,146,245,62,1,50,231, - 149,62,16,237,57,0,211,80,241,251,237,77, - 201,205,186,149,229,229,33,0,0,34,37,152, - 33,110,152,126,50,234,151,58,44,152,33,235, - 151,119,221,54,253,0,221,54,254,0,195,230, - 148,33,236,151,54,175,33,3,0,229,33,234, - 151,229,205,174,140,193,193,33,236,151,126,254, - 255,40,74,33,245,151,110,221,117,255,33,249, - 151,126,221,166,255,221,119,255,33,253,151,126, - 221,166,255,221,119,255,58,232,149,95,221,126, - 255,163,221,119,255,183,40,15,230,191,33,110, - 152,94,22,0,33,234,149,25,119,24,12,33, - 110,152,94,22,0,33,234,149,25,54,132,33, - 0,0,195,198,149,221,110,253,221,102,254,35, - 221,117,253,221,116,254,17,32,0,221,110,253, - 221,102,254,205,171,149,250,117,148,58,233,149, - 203,87,40,84,33,1,0,34,37,152,221,54, - 253,0,221,54,254,0,24,53,33,236,151,54, - 175,33,3,0,229,33,234,151,229,205,174,140, - 193,193,33,236,151,126,254,255,40,14,33,110, - 152,94,22,0,33,234,149,25,54,140,24,159, - 221,110,253,221,102,254,35,221,117,253,221,116, - 254,17,32,0,221,110,253,221,102,254,205,171, - 149,250,12,149,33,2,0,34,37,152,221,54, - 253,0,221,54,254,0,24,54,33,236,151,54, - 175,33,3,0,229,33,234,151,229,205,174,140, - 193,193,33,236,151,126,254,255,40,15,33,110, - 152,94,22,0,33,234,149,25,54,132,195,211, - 148,221,110,253,221,102,254,35,221,117,253,221, - 116,254,17,32,0,221,110,253,221,102,254,205, - 171,149,250,96,149,33,1,0,195,198,149,124, - 170,250,179,149,237,82,201,124,230,128,237,82, - 60,201,225,253,229,221,229,221,33,0,0,221, - 57,233,221,249,221,225,253,225,201,233,225,253, - 229,221,229,221,33,0,0,221,57,94,35,86, - 35,235,57,249,235,233,0,0,0,0,0,0, - 62,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 175,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,133,1,0,0,0,63, - 255,255,255,255,0,0,0,63,0,0,0,0, - 0,0,0,0,0,0,0,24,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0 - } ; - -#endif diff --git a/drivers/net/appletalk/cops_ltdrv.h b/drivers/net/appletalk/cops_ltdrv.h deleted file mode 100644 index c699b1ad31da..000000000000 --- a/drivers/net/appletalk/cops_ltdrv.h +++ /dev/null @@ -1,241 +0,0 @@ -/* - * The firmware this driver downloads into the Localtalk card is a - * separate program and is not GPL'd source code, even though the Linux - * side driver and the routine that loads this data into the card are. - * - * It is taken from the COPS SDK and is under the following license - * - * This material is licensed to you strictly for use in conjunction with - * the use of COPS LocalTalk adapters. - * There is no charge for this SDK. And no waranty express or implied - * about its fitness for any purpose. However, we will cheerefully - * refund every penny you paid for this SDK... - * Regards, - * - * Thomas F. Divine - * Chief Scientist - */ - - -/* cops_ltdrv.h: LocalTalk driver firmware dump for Linux. - * - * Authors: - * - Jay Schulist <jschlst@samba.org> - */ - - -#ifdef CONFIG_COPS_TANGENT - -static const unsigned char ltdrv_code[] = { - 58,3,0,50,148,10,33,143,15,62,85,119, - 190,32,9,62,170,119,190,32,3,35,24,241, - 34,146,10,249,17,150,10,33,143,15,183,237, - 82,77,68,11,107,98,19,54,0,237,176,62, - 16,237,57,51,62,0,237,57,50,237,57,54, - 62,12,237,57,49,62,195,33,39,2,50,56, - 0,34,57,0,237,86,205,30,2,251,205,60, - 10,24,169,67,111,112,121,114,105,103,104,116, - 32,40,99,41,32,49,57,56,56,45,49,57, - 57,50,44,32,80,114,105,110,116,105,110,103, - 32,67,111,109,109,117,110,105,99,97,116,105, - 111,110,115,32,65,115,115,111,99,105,97,116, - 101,115,44,32,73,110,99,46,65,108,108,32, - 114,105,103,104,116,115,32,114,101,115,101,114, - 118,101,100,46,32,32,4,4,22,40,255,60, - 4,96,10,224,6,0,7,126,2,64,11,246, - 12,6,13,0,14,193,15,0,5,96,3,192, - 1,0,9,8,62,3,211,82,62,192,211,82, - 201,62,3,211,82,62,213,211,82,201,62,5, - 211,82,62,224,211,82,201,62,5,211,82,62, - 224,211,82,201,62,5,211,82,62,96,211,82, - 201,6,28,33,180,1,14,82,237,163,194,4, - 2,33,39,2,34,64,0,58,3,0,230,1, - 192,62,11,237,121,62,118,237,121,201,33,182, - 10,54,132,205,253,1,201,245,197,213,229,42, - 150,10,14,83,17,98,2,67,20,237,162,58, - 179,1,95,219,82,230,1,32,6,29,32,247, - 195,17,3,62,1,211,82,219,82,95,230,160, - 32,10,237,162,32,225,21,32,222,195,15,3, - 237,162,123,230,96,194,21,3,62,48,211,82, - 62,1,211,82,175,211,82,237,91,150,10,43, - 55,237,82,218,19,3,34,152,10,98,107,58, - 154,10,190,32,81,62,1,50,158,10,35,35, - 62,132,190,32,44,54,133,43,70,58,154,10, - 119,43,112,17,3,0,205,137,3,62,16,211, - 82,62,56,211,82,205,217,1,42,150,10,14, - 83,17,98,2,67,20,58,178,1,95,195,59, - 2,62,129,190,194,227,2,54,130,43,70,58, - 154,10,119,43,112,17,3,0,205,137,3,195, - 254,2,35,35,126,254,132,194,227,2,205,61, - 3,24,20,62,128,166,194,222,2,221,229,221, - 33,175,10,205,93,6,205,144,7,221,225,225, - 209,193,241,251,237,77,221,229,221,33,159,10, - 205,93,6,221,225,205,61,3,195,247,2,24, - 237,24,235,24,233,230,64,40,2,24,227,24, - 225,175,50,179,10,205,208,1,201,197,33,4, - 0,57,126,35,102,111,205,51,3,193,201,62, - 1,50,179,10,34,150,10,54,0,58,179,10, - 183,200,62,14,211,82,62,193,211,82,62,10, - 211,82,62,224,211,82,62,6,211,82,58,154, - 10,211,82,62,16,211,82,62,56,211,82,62, - 48,211,82,219,82,230,1,40,4,219,83,24, - 242,62,14,211,82,62,33,211,82,62,1,211, - 82,62,9,211,82,62,32,211,82,205,217,1, - 201,14,83,205,208,1,24,23,14,83,205,208, - 1,205,226,1,58,174,1,61,32,253,205,244, - 1,58,174,1,61,32,253,205,226,1,58,175, - 1,61,32,253,62,5,211,82,62,233,211,82, - 62,128,211,82,58,176,1,61,32,253,237,163, - 27,62,192,211,82,219,82,230,4,40,250,237, - 163,27,122,179,32,243,219,82,230,4,40,250, - 58,178,1,71,219,82,230,4,40,3,5,32, - 247,219,82,230,4,40,250,205,235,1,58,177, - 1,61,32,253,205,244,1,201,229,213,35,35, - 126,230,128,194,145,4,43,58,154,10,119,43, - 70,33,181,10,119,43,112,17,3,0,243,62, - 10,211,82,219,82,230,128,202,41,4,209,225, - 62,1,55,251,201,205,144,3,58,180,10,254, - 255,202,127,4,205,217,1,58,178,1,71,219, - 82,230,1,32,6,5,32,247,195,173,4,219, - 83,71,58,154,10,184,194,173,4,58,178,1, - 71,219,82,230,1,32,6,5,32,247,195,173, - 4,219,83,58,178,1,71,219,82,230,1,32, - 6,5,32,247,195,173,4,219,83,254,133,194, - 173,4,58,179,1,24,4,58,179,1,135,61, - 32,253,209,225,205,137,3,205,61,3,183,251, - 201,209,225,243,62,10,211,82,219,82,230,128, - 202,164,4,62,1,55,251,201,205,144,3,205, - 61,3,183,251,201,209,225,62,2,55,251,201, - 243,62,14,211,82,62,33,211,82,251,201,33, - 4,0,57,94,35,86,33,2,0,57,126,35, - 102,111,221,229,34,193,10,237,83,195,10,221, - 33,171,10,205,93,6,58,185,10,50,186,10, - 58,184,10,135,50,184,10,205,112,6,254,3, - 56,16,58,185,10,135,60,230,15,50,185,10, - 175,50,184,10,24,23,58,183,10,205,112,6, - 254,3,48,13,58,185,10,203,63,50,185,10, - 62,255,50,183,10,58,185,10,50,186,10,58, - 183,10,135,50,183,10,62,32,50,187,10,50, - 188,10,6,255,219,82,230,16,32,3,5,32, - 247,205,180,4,6,40,219,82,230,16,40,3, - 5,32,247,62,10,211,82,219,82,230,128,194, - 46,5,219,82,230,16,40,214,237,95,71,58, - 186,10,160,230,15,40,32,71,14,10,62,10, - 211,82,219,82,230,128,202,119,5,205,180,4, - 195,156,5,219,82,230,16,202,156,5,13,32, - 229,16,225,42,193,10,237,91,195,10,205,252, - 3,48,7,61,202,156,5,195,197,5,221,225, - 33,0,0,201,221,33,163,10,205,93,6,58, - 188,10,61,50,188,10,40,19,58,186,10,246, - 1,50,186,10,58,183,10,246,1,50,183,10, - 195,46,5,221,225,33,1,0,201,221,33,167, - 10,205,93,6,58,184,10,246,1,50,184,10, - 58,186,10,135,246,1,50,186,10,58,187,10, - 61,50,187,10,194,46,5,221,225,33,2,0, - 201,221,229,33,0,0,57,17,4,0,25,126, - 50,154,10,230,128,50,189,10,58,189,10,183, - 40,6,221,33,88,2,24,4,221,33,150,0, - 58,154,10,183,40,49,60,40,46,61,33,190, - 10,119,35,119,35,54,129,175,50,158,10,221, - 43,221,229,225,124,181,40,42,33,190,10,17, - 3,0,205,206,4,17,232,3,27,123,178,32, - 251,58,158,10,183,40,224,58,154,10,71,62, - 7,128,230,127,71,58,189,10,176,50,154,10, - 24,166,221,225,201,183,221,52,0,192,221,52, - 1,192,221,52,2,192,221,52,3,192,55,201, - 6,8,14,0,31,48,1,12,16,250,121,201, - 33,2,0,57,94,35,86,35,78,35,70,35, - 126,35,102,105,79,120,68,103,237,176,201,33, - 2,0,57,126,35,102,111,62,17,237,57,48, - 125,237,57,40,124,237,57,41,62,0,237,57, - 42,62,64,237,57,43,62,0,237,57,44,33, - 128,2,125,237,57,46,124,237,57,47,62,145, - 237,57,48,211,68,58,149,10,211,66,201,33, - 2,0,57,126,35,102,111,62,33,237,57,48, - 62,64,237,57,32,62,0,237,57,33,237,57, - 34,125,237,57,35,124,237,57,36,62,0,237, - 57,37,33,128,2,125,237,57,38,124,237,57, - 39,62,97,237,57,48,211,67,58,149,10,211, - 66,201,237,56,46,95,237,56,47,87,237,56, - 46,111,237,56,47,103,183,237,82,32,235,33, - 128,2,183,237,82,201,237,56,38,95,237,56, - 39,87,237,56,38,111,237,56,39,103,183,237, - 82,32,235,33,128,2,183,237,82,201,205,106, - 10,221,110,6,221,102,7,126,35,110,103,195, - 118,10,205,106,10,33,0,0,34,205,10,34, - 198,10,34,200,10,33,143,15,34,207,10,237, - 91,207,10,42,146,10,183,237,82,17,0,255, - 25,34,203,10,203,124,40,6,33,0,125,34, - 203,10,42,207,10,229,205,37,3,195,118,10, - 205,106,10,229,42,150,10,35,35,35,229,205, - 70,7,193,124,230,3,103,221,117,254,221,116, - 255,237,91,152,10,35,35,35,183,237,82,32, - 12,17,5,0,42,152,10,205,91,10,242,203, - 7,42,150,10,229,205,37,3,195,118,10,237, - 91,152,10,42,200,10,25,34,200,10,42,205, - 10,25,34,205,10,237,91,203,10,33,158,253, - 25,237,91,205,10,205,91,10,242,245,7,33, - 0,0,34,205,10,62,1,50,197,10,205,5, - 8,33,0,0,57,249,195,118,10,205,106,10, - 58,197,10,183,202,118,10,237,91,198,10,42, - 205,10,205,91,10,242,46,8,237,91,205,10, - 33,98,2,25,237,91,198,10,205,91,10,250, - 78,8,237,91,198,10,42,205,10,183,237,82, - 32,7,42,200,10,125,180,40,13,237,91,205, - 10,42,198,10,205,91,10,242,97,8,237,91, - 207,10,42,205,10,25,229,205,37,3,175,50, - 197,10,195,118,10,205,29,3,33,0,0,57, - 249,195,118,10,205,106,10,58,202,10,183,40, - 22,205,14,7,237,91,209,10,19,19,19,205, - 91,10,242,139,8,33,1,0,195,118,10,33, - 0,0,195,118,10,205,126,10,252,255,205,108, - 8,125,180,194,118,10,237,91,200,10,33,0, - 0,205,91,10,242,118,10,237,91,207,10,42, - 198,10,25,221,117,254,221,116,255,35,35,35, - 229,205,70,7,193,124,230,3,103,35,35,35, - 221,117,252,221,116,253,229,221,110,254,221,102, - 255,229,33,212,10,229,205,124,6,193,193,221, - 110,252,221,102,253,34,209,10,33,211,10,54, - 4,33,209,10,227,205,147,6,193,62,1,50, - 202,10,243,221,94,252,221,86,253,42,200,10, - 183,237,82,34,200,10,203,124,40,17,33,0, - 0,34,200,10,34,205,10,34,198,10,50,197, - 10,24,37,221,94,252,221,86,253,42,198,10, - 25,34,198,10,237,91,203,10,33,158,253,25, - 237,91,198,10,205,91,10,242,68,9,33,0, - 0,34,198,10,205,5,8,33,0,0,57,249, - 251,195,118,10,205,106,10,33,49,13,126,183, - 40,16,205,42,7,237,91,47,13,19,19,19, - 205,91,10,242,117,9,58,142,15,198,1,50, - 142,15,195,118,10,33,49,13,126,254,1,40, - 25,254,3,202,7,10,254,5,202,21,10,33, - 49,13,54,0,33,47,13,229,205,207,6,195, - 118,10,58,141,15,183,32,72,33,51,13,126, - 50,149,10,205,86,7,33,50,13,126,230,127, - 183,32,40,58,142,15,230,127,50,142,15,183, - 32,5,198,1,50,142,15,33,50,13,126,111, - 23,159,103,203,125,58,142,15,40,5,198,128, - 50,142,15,33,50,13,119,33,50,13,126,111, - 23,159,103,229,205,237,5,193,33,211,10,54, - 2,33,2,0,34,209,10,58,154,10,33,212, - 10,119,58,148,10,33,213,10,119,33,209,10, - 229,205,147,6,193,24,128,42,47,13,229,33, - 50,13,229,205,191,4,193,24,239,33,211,10, - 54,6,33,3,0,34,209,10,58,154,10,33, - 212,10,119,58,148,10,33,213,10,119,33,214, - 10,54,5,33,209,10,229,205,147,6,24,200, - 205,106,10,33,49,13,54,0,33,47,13,229, - 205,207,6,33,209,10,227,205,147,6,193,205, - 80,9,205,145,8,24,248,124,170,250,99,10, - 237,82,201,124,230,128,237,82,60,201,225,253, - 229,221,229,221,33,0,0,221,57,233,221,249, - 221,225,253,225,201,233,225,253,229,221,229,221, - 33,0,0,221,57,94,35,86,35,235,57,249, - 235,233,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0 - } ; - -#endif diff --git a/drivers/video/fbdev/nvidia/Makefile b/drivers/video/fbdev/nvidia/Makefile deleted file mode 100644 index cdd6e8ac454a..000000000000 --- a/drivers/video/fbdev/nvidia/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Makefile for the nVidia framebuffer driver -# - -obj-$(CONFIG_FB_NVIDIA) += nvidiafb.o - -nvidiafb-y := nvidia.o nv_hw.o nv_setup.o \ - nv_accel.o nv_of.o -nvidiafb-$(CONFIG_FB_NVIDIA_I2C) += nv_i2c.o -nvidiafb-$(CONFIG_FB_NVIDIA_BACKLIGHT) += nv_backlight.o - -nvidiafb-objs := $(nvidiafb-y) diff --git a/drivers/video/fbdev/nvidia/nv_accel.c b/drivers/video/fbdev/nvidia/nv_accel.c deleted file mode 100644 index 7341fed63e35..000000000000 --- a/drivers/video/fbdev/nvidia/nv_accel.c +++ /dev/null @@ -1,418 +0,0 @@ - /***************************************************************************\ -|* *| -|* Copyright 1993-2003 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NOTICE TO USER: The source code is copyrighted under U.S. and *| -|* international laws. Users and possessors of this source code are *| -|* hereby granted a nonexclusive, royalty-free copyright license to *| -|* use this code in individual and commercial software. *| -|* *| -|* Any use of this source code must include, in the user documenta- *| -|* tion and internal comments to the code, notices to the end user *| -|* as follows: *| -|* *| -|* Copyright 1993-2003 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *| -|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *| -|* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *| -|* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *| -|* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *| -|* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *| -|* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *| -|* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *| -|* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *| -|* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *| -|* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *| -|* *| -|* U.S. Government End Users. This source code is a "commercial *| -|* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *| -|* consisting of "commercial computer software" and "commercial *| -|* computer software documentation," as such terms are used in *| -|* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *| -|* ment only as a commercial end item. Consistent with 48 C.F.R. *| -|* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *| -|* all U.S. Government End Users acquire the source code with only *| -|* those rights set forth herein. *| -|* *| - \***************************************************************************/ - -/* - * GPL Licensing Note - According to Mark Vojkovich, author of the Xorg/ - * XFree86 'nv' driver, this source code is provided under MIT-style licensing - * where the source code is provided "as is" without warranty of any kind. - * The only usage restriction is for the copyright notices to be retained - * whenever code is used. - * - * Antonino Daplas <adaplas@pol.net> 2005-03-11 - */ - -#include <linux/fb.h> -#include <linux/nmi.h> - -#include "nv_type.h" -#include "nv_proto.h" -#include "nv_dma.h" -#include "nv_local.h" - -/* There is a HW race condition with videoram command buffers. - You can't jump to the location of your put offset. We write put - at the jump offset + SKIPS dwords with noop padding in between - to solve this problem */ -#define SKIPS 8 - -static const int NVCopyROP[16] = { - 0xCC, /* copy */ - 0x55 /* invert */ -}; - -static const int NVCopyROP_PM[16] = { - 0xCA, /* copy */ - 0x5A, /* invert */ -}; - -static inline void nvidiafb_safe_mode(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - - touch_softlockup_watchdog(); - info->pixmap.scan_align = 1; - par->lockup = 1; -} - -static inline void NVFlush(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - int count = 1000000000; - - while (--count && READ_GET(par) != par->dmaPut) ; - - if (!count) { - printk("nvidiafb: DMA Flush lockup\n"); - nvidiafb_safe_mode(info); - } -} - -static inline void NVSync(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - int count = 1000000000; - - while (--count && NV_RD32(par->PGRAPH, 0x0700)) ; - - if (!count) { - printk("nvidiafb: DMA Sync lockup\n"); - nvidiafb_safe_mode(info); - } -} - -static void NVDmaKickoff(struct nvidia_par *par) -{ - if (par->dmaCurrent != par->dmaPut) { - par->dmaPut = par->dmaCurrent; - WRITE_PUT(par, par->dmaPut); - } -} - -static void NVDmaWait(struct fb_info *info, int size) -{ - struct nvidia_par *par = info->par; - int dmaGet; - int count = 1000000000, cnt; - size++; - - while (par->dmaFree < size && --count && !par->lockup) { - dmaGet = READ_GET(par); - - if (par->dmaPut >= dmaGet) { - par->dmaFree = par->dmaMax - par->dmaCurrent; - if (par->dmaFree < size) { - NVDmaNext(par, 0x20000000); - if (dmaGet <= SKIPS) { - if (par->dmaPut <= SKIPS) - WRITE_PUT(par, SKIPS + 1); - cnt = 1000000000; - do { - dmaGet = READ_GET(par); - } while (--cnt && dmaGet <= SKIPS); - if (!cnt) { - printk("DMA Get lockup\n"); - par->lockup = 1; - } - } - WRITE_PUT(par, SKIPS); - par->dmaCurrent = par->dmaPut = SKIPS; - par->dmaFree = dmaGet - (SKIPS + 1); - } - } else - par->dmaFree = dmaGet - par->dmaCurrent - 1; - } - - if (!count) { - printk("nvidiafb: DMA Wait Lockup\n"); - nvidiafb_safe_mode(info); - } -} - -static void NVSetPattern(struct fb_info *info, u32 clr0, u32 clr1, - u32 pat0, u32 pat1) -{ - struct nvidia_par *par = info->par; - - NVDmaStart(info, par, PATTERN_COLOR_0, 4); - NVDmaNext(par, clr0); - NVDmaNext(par, clr1); - NVDmaNext(par, pat0); - NVDmaNext(par, pat1); -} - -static void NVSetRopSolid(struct fb_info *info, u32 rop, u32 planemask) -{ - struct nvidia_par *par = info->par; - - if (planemask != ~0) { - NVSetPattern(info, 0, planemask, ~0, ~0); - if (par->currentRop != (rop + 32)) { - NVDmaStart(info, par, ROP_SET, 1); - NVDmaNext(par, NVCopyROP_PM[rop]); - par->currentRop = rop + 32; - } - } else if (par->currentRop != rop) { - if (par->currentRop >= 16) - NVSetPattern(info, ~0, ~0, ~0, ~0); - NVDmaStart(info, par, ROP_SET, 1); - NVDmaNext(par, NVCopyROP[rop]); - par->currentRop = rop; - } -} - -static void NVSetClippingRectangle(struct fb_info *info, int x1, int y1, - int x2, int y2) -{ - struct nvidia_par *par = info->par; - int h = y2 - y1 + 1; - int w = x2 - x1 + 1; - - NVDmaStart(info, par, CLIP_POINT, 2); - NVDmaNext(par, (y1 << 16) | x1); - NVDmaNext(par, (h << 16) | w); -} - -void NVResetGraphics(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - u32 surfaceFormat, patternFormat, rectFormat, lineFormat; - int pitch, i; - - pitch = info->fix.line_length; - - par->dmaBase = (u32 __iomem *) (&par->FbStart[par->FbUsableSize]); - - for (i = 0; i < SKIPS; i++) - NV_WR32(&par->dmaBase[i], 0, 0x00000000); - - NV_WR32(&par->dmaBase[0x0 + SKIPS], 0, 0x00040000); - NV_WR32(&par->dmaBase[0x1 + SKIPS], 0, 0x80000010); - NV_WR32(&par->dmaBase[0x2 + SKIPS], 0, 0x00042000); - NV_WR32(&par->dmaBase[0x3 + SKIPS], 0, 0x80000011); - NV_WR32(&par->dmaBase[0x4 + SKIPS], 0, 0x00044000); - NV_WR32(&par->dmaBase[0x5 + SKIPS], 0, 0x80000012); - NV_WR32(&par->dmaBase[0x6 + SKIPS], 0, 0x00046000); - NV_WR32(&par->dmaBase[0x7 + SKIPS], 0, 0x80000013); - NV_WR32(&par->dmaBase[0x8 + SKIPS], 0, 0x00048000); - NV_WR32(&par->dmaBase[0x9 + SKIPS], 0, 0x80000014); - NV_WR32(&par->dmaBase[0xA + SKIPS], 0, 0x0004A000); - NV_WR32(&par->dmaBase[0xB + SKIPS], 0, 0x80000015); - NV_WR32(&par->dmaBase[0xC + SKIPS], 0, 0x0004C000); - NV_WR32(&par->dmaBase[0xD + SKIPS], 0, 0x80000016); - NV_WR32(&par->dmaBase[0xE + SKIPS], 0, 0x0004E000); - NV_WR32(&par->dmaBase[0xF + SKIPS], 0, 0x80000017); - - par->dmaPut = 0; - par->dmaCurrent = 16 + SKIPS; - par->dmaMax = 8191; - par->dmaFree = par->dmaMax - par->dmaCurrent; - - switch (info->var.bits_per_pixel) { - case 32: - case 24: - surfaceFormat = SURFACE_FORMAT_DEPTH24; - patternFormat = PATTERN_FORMAT_DEPTH24; - rectFormat = RECT_FORMAT_DEPTH24; - lineFormat = LINE_FORMAT_DEPTH24; - break; - case 16: - surfaceFormat = SURFACE_FORMAT_DEPTH16; - patternFormat = PATTERN_FORMAT_DEPTH16; - rectFormat = RECT_FORMAT_DEPTH16; - lineFormat = LINE_FORMAT_DEPTH16; - break; - default: - surfaceFormat = SURFACE_FORMAT_DEPTH8; - patternFormat = PATTERN_FORMAT_DEPTH8; - rectFormat = RECT_FORMAT_DEPTH8; - lineFormat = LINE_FORMAT_DEPTH8; - break; - } - - NVDmaStart(info, par, SURFACE_FORMAT, 4); - NVDmaNext(par, surfaceFormat); - NVDmaNext(par, pitch | (pitch << 16)); - NVDmaNext(par, 0); - NVDmaNext(par, 0); - - NVDmaStart(info, par, PATTERN_FORMAT, 1); - NVDmaNext(par, patternFormat); - - NVDmaStart(info, par, RECT_FORMAT, 1); - NVDmaNext(par, rectFormat); - - NVDmaStart(info, par, LINE_FORMAT, 1); - NVDmaNext(par, lineFormat); - - par->currentRop = ~0; /* set to something invalid */ - NVSetRopSolid(info, ROP_COPY, ~0); - - NVSetClippingRectangle(info, 0, 0, info->var.xres_virtual, - info->var.yres_virtual); - - NVDmaKickoff(par); -} - -int nvidiafb_sync(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - - if (info->state != FBINFO_STATE_RUNNING) - return 0; - - if (!par->lockup) - NVFlush(info); - - if (!par->lockup) - NVSync(info); - - return 0; -} - -void nvidiafb_copyarea(struct fb_info *info, const struct fb_copyarea *region) -{ - struct nvidia_par *par = info->par; - - if (info->state != FBINFO_STATE_RUNNING) - return; - - if (par->lockup) { - cfb_copyarea(info, region); - return; - } - - NVDmaStart(info, par, BLIT_POINT_SRC, 3); - NVDmaNext(par, (region->sy << 16) | region->sx); - NVDmaNext(par, (region->dy << 16) | region->dx); - NVDmaNext(par, (region->height << 16) | region->width); - - NVDmaKickoff(par); -} - -void nvidiafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) -{ - struct nvidia_par *par = info->par; - u32 color; - - if (info->state != FBINFO_STATE_RUNNING) - return; - - if (par->lockup) { - cfb_fillrect(info, rect); - return; - } - - if (info->var.bits_per_pixel == 8) - color = rect->color; - else - color = ((u32 *) info->pseudo_palette)[rect->color]; - - if (rect->rop != ROP_COPY) - NVSetRopSolid(info, rect->rop, ~0); - - NVDmaStart(info, par, RECT_SOLID_COLOR, 1); - NVDmaNext(par, color); - - NVDmaStart(info, par, RECT_SOLID_RECTS(0), 2); - NVDmaNext(par, (rect->dx << 16) | rect->dy); - NVDmaNext(par, (rect->width << 16) | rect->height); - - NVDmaKickoff(par); - - if (rect->rop != ROP_COPY) - NVSetRopSolid(info, ROP_COPY, ~0); -} - -static void nvidiafb_mono_color_expand(struct fb_info *info, - const struct fb_image *image) -{ - struct nvidia_par *par = info->par; - u32 fg, bg, mask = ~(~0 >> (32 - info->var.bits_per_pixel)); - u32 dsize, width, *data = (u32 *) image->data, tmp; - int j, k = 0; - - width = (image->width + 31) & ~31; - dsize = (width * image->height) >> 5; - - if (info->var.bits_per_pixel == 8) { - fg = image->fg_color | mask; - bg = image->bg_color | mask; - } else { - fg = ((u32 *) info->pseudo_palette)[image->fg_color] | mask; - bg = ((u32 *) info->pseudo_palette)[image->bg_color] | mask; - } - - NVDmaStart(info, par, RECT_EXPAND_TWO_COLOR_CLIP, 7); - NVDmaNext(par, (image->dy << 16) | (image->dx & 0xffff)); - NVDmaNext(par, ((image->dy + image->height) << 16) | - ((image->dx + image->width) & 0xffff)); - NVDmaNext(par, bg); - NVDmaNext(par, fg); - NVDmaNext(par, (image->height << 16) | width); - NVDmaNext(par, (image->height << 16) | width); - NVDmaNext(par, (image->dy << 16) | (image->dx & 0xffff)); - - while (dsize >= RECT_EXPAND_TWO_COLOR_DATA_MAX_DWORDS) { - NVDmaStart(info, par, RECT_EXPAND_TWO_COLOR_DATA(0), - RECT_EXPAND_TWO_COLOR_DATA_MAX_DWORDS); - - for (j = RECT_EXPAND_TWO_COLOR_DATA_MAX_DWORDS; j--;) { - tmp = data[k++]; - reverse_order(&tmp); - NVDmaNext(par, tmp); - } - - dsize -= RECT_EXPAND_TWO_COLOR_DATA_MAX_DWORDS; - } - - if (dsize) { - NVDmaStart(info, par, RECT_EXPAND_TWO_COLOR_DATA(0), dsize); - - for (j = dsize; j--;) { - tmp = data[k++]; - reverse_order(&tmp); - NVDmaNext(par, tmp); - } - } - - NVDmaKickoff(par); -} - -void nvidiafb_imageblit(struct fb_info *info, const struct fb_image *image) -{ - struct nvidia_par *par = info->par; - - if (info->state != FBINFO_STATE_RUNNING) - return; - - if (image->depth == 1 && !par->lockup) - nvidiafb_mono_color_expand(info, image); - else - cfb_imageblit(info, image); -} diff --git a/drivers/video/fbdev/nvidia/nv_backlight.c b/drivers/video/fbdev/nvidia/nv_backlight.c deleted file mode 100644 index 2ce53529f636..000000000000 --- a/drivers/video/fbdev/nvidia/nv_backlight.c +++ /dev/null @@ -1,137 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Backlight code for nVidia based graphic cards - * - * Copyright 2004 Antonino Daplas <adaplas@pol.net> - * Copyright (c) 2006 Michael Hanselmann <linux-kernel@hansmi.ch> - */ - -#include <linux/backlight.h> -#include <linux/fb.h> -#include <linux/pci.h> - -#ifdef CONFIG_PMAC_BACKLIGHT -#include <asm/backlight.h> -#endif - -#include "nv_local.h" -#include "nv_type.h" -#include "nv_proto.h" - -/* We do not have any information about which values are allowed, thus - * we used safe values. - */ -#define MIN_LEVEL 0x158 -#define MAX_LEVEL 0x534 -#define LEVEL_STEP ((MAX_LEVEL - MIN_LEVEL) / FB_BACKLIGHT_MAX) - -static int nvidia_bl_get_level_brightness(struct nvidia_par *par, - int level) -{ - struct fb_info *info = pci_get_drvdata(par->pci_dev); - int nlevel; - - /* Get and convert the value */ - /* No locking of bl_curve since we read a single value */ - nlevel = MIN_LEVEL + info->bl_curve[level] * LEVEL_STEP; - - if (nlevel < 0) - nlevel = 0; - else if (nlevel < MIN_LEVEL) - nlevel = MIN_LEVEL; - else if (nlevel > MAX_LEVEL) - nlevel = MAX_LEVEL; - - return nlevel; -} - -static int nvidia_bl_update_status(struct backlight_device *bd) -{ - struct nvidia_par *par = bl_get_data(bd); - u32 tmp_pcrt, tmp_pmc, fpcontrol; - int level; - - if (!par->FlatPanel) - return 0; - - if (bd->props.power != FB_BLANK_UNBLANK || - bd->props.fb_blank != FB_BLANK_UNBLANK) - level = 0; - else - level = bd->props.brightness; - - tmp_pmc = NV_RD32(par->PMC, 0x10F0) & 0x0000FFFF; - tmp_pcrt = NV_RD32(par->PCRTC0, 0x081C) & 0xFFFFFFFC; - fpcontrol = NV_RD32(par->PRAMDAC, 0x0848) & 0xCFFFFFCC; - - if (level > 0) { - tmp_pcrt |= 0x1; - tmp_pmc |= (1 << 31); /* backlight bit */ - tmp_pmc |= nvidia_bl_get_level_brightness(par, level) << 16; - fpcontrol |= par->fpSyncs; - } else - fpcontrol |= 0x20000022; - - NV_WR32(par->PCRTC0, 0x081C, tmp_pcrt); - NV_WR32(par->PMC, 0x10F0, tmp_pmc); - NV_WR32(par->PRAMDAC, 0x848, fpcontrol); - - return 0; -} - -static const struct backlight_ops nvidia_bl_ops = { - .update_status = nvidia_bl_update_status, -}; - -void nvidia_bl_init(struct nvidia_par *par) -{ - struct backlight_properties props; - struct fb_info *info = pci_get_drvdata(par->pci_dev); - struct backlight_device *bd; - char name[12]; - - if (!par->FlatPanel) - return; - -#ifdef CONFIG_PMAC_BACKLIGHT - if (!machine_is(powermac) || - !pmac_has_backlight_type("mnca")) - return; -#endif - - snprintf(name, sizeof(name), "nvidiabl%d", info->node); - - memset(&props, 0, sizeof(struct backlight_properties)); - props.type = BACKLIGHT_RAW; - props.max_brightness = FB_BACKLIGHT_LEVELS - 1; - bd = backlight_device_register(name, info->dev, par, &nvidia_bl_ops, - &props); - if (IS_ERR(bd)) { - info->bl_dev = NULL; - printk(KERN_WARNING "nvidia: Backlight registration failed\n"); - goto error; - } - - info->bl_dev = bd; - fb_bl_default_curve(info, 0, - 0x158 * FB_BACKLIGHT_MAX / MAX_LEVEL, - 0x534 * FB_BACKLIGHT_MAX / MAX_LEVEL); - - bd->props.brightness = bd->props.max_brightness; - bd->props.power = FB_BLANK_UNBLANK; - backlight_update_status(bd); - - printk("nvidia: Backlight initialized (%s)\n", name); - -error: - return; -} - -void nvidia_bl_exit(struct nvidia_par *par) -{ - struct fb_info *info = pci_get_drvdata(par->pci_dev); - struct backlight_device *bd = info->bl_dev; - - backlight_device_unregister(bd); - printk("nvidia: Backlight unloaded\n"); -} diff --git a/drivers/video/fbdev/nvidia/nv_dma.h b/drivers/video/fbdev/nvidia/nv_dma.h deleted file mode 100644 index a7ed1c0acbbb..000000000000 --- a/drivers/video/fbdev/nvidia/nv_dma.h +++ /dev/null @@ -1,188 +0,0 @@ - - /***************************************************************************\ -|* *| -|* Copyright 2003 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NOTICE TO USER: The source code is copyrighted under U.S. and *| -|* international laws. Users and possessors of this source code are *| -|* hereby granted a nonexclusive, royalty-free copyright license to *| -|* use this code in individual and commercial software. *| -|* *| -|* Any use of this source code must include, in the user documenta- *| -|* tion and internal comments to the code, notices to the end user *| -|* as follows: *| -|* *| -|* Copyright 2003 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *| -|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *| -|* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *| -|* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *| -|* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *| -|* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *| -|* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *| -|* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *| -|* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *| -|* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *| -|* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *| -|* *| -|* U.S. Government End Users. This source code is a "commercial *| -|* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *| -|* consisting of "commercial computer software" and "commercial *| -|* computer software documentation," as such terms are used in *| -|* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *| -|* ment only as a commercial end item. Consistent with 48 C.F.R. *| -|* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *| -|* all U.S. Government End Users acquire the source code with only *| -|* those rights set forth herein. *| -|* *| - \***************************************************************************/ - -/* - * GPL Licensing Note - According to Mark Vojkovich, author of the Xorg/ - * XFree86 'nv' driver, this source code is provided under MIT-style licensing - * where the source code is provided "as is" without warranty of any kind. - * The only usage restriction is for the copyright notices to be retained - * whenever code is used. - * - * Antonino Daplas <adaplas@pol.net> 2005-03-11 - */ - -#define SURFACE_FORMAT 0x00000300 -#define SURFACE_FORMAT_DEPTH8 0x00000001 -#define SURFACE_FORMAT_DEPTH15 0x00000002 -#define SURFACE_FORMAT_DEPTH16 0x00000004 -#define SURFACE_FORMAT_DEPTH24 0x00000006 -#define SURFACE_PITCH 0x00000304 -#define SURFACE_PITCH_SRC 15:0 -#define SURFACE_PITCH_DST 31:16 -#define SURFACE_OFFSET_SRC 0x00000308 -#define SURFACE_OFFSET_DST 0x0000030C - -#define ROP_SET 0x00002300 - -#define PATTERN_FORMAT 0x00004300 -#define PATTERN_FORMAT_DEPTH8 0x00000003 -#define PATTERN_FORMAT_DEPTH16 0x00000001 -#define PATTERN_FORMAT_DEPTH24 0x00000003 -#define PATTERN_COLOR_0 0x00004310 -#define PATTERN_COLOR_1 0x00004314 -#define PATTERN_PATTERN_0 0x00004318 -#define PATTERN_PATTERN_1 0x0000431C - -#define CLIP_POINT 0x00006300 -#define CLIP_POINT_X 15:0 -#define CLIP_POINT_Y 31:16 -#define CLIP_SIZE 0x00006304 -#define CLIP_SIZE_WIDTH 15:0 -#define CLIP_SIZE_HEIGHT 31:16 - -#define LINE_FORMAT 0x00008300 -#define LINE_FORMAT_DEPTH8 0x00000003 -#define LINE_FORMAT_DEPTH16 0x00000001 -#define LINE_FORMAT_DEPTH24 0x00000003 -#define LINE_COLOR 0x00008304 -#define LINE_MAX_LINES 16 -#define LINE_LINES(i) 0x00008400\ - +(i)*8 -#define LINE_LINES_POINT0_X 15:0 -#define LINE_LINES_POINT0_Y 31:16 -#define LINE_LINES_POINT1_X 47:32 -#define LINE_LINES_POINT1_Y 63:48 - -#define BLIT_POINT_SRC 0x0000A300 -#define BLIT_POINT_SRC_X 15:0 -#define BLIT_POINT_SRC_Y 31:16 -#define BLIT_POINT_DST 0x0000A304 -#define BLIT_POINT_DST_X 15:0 -#define BLIT_POINT_DST_Y 31:16 -#define BLIT_SIZE 0x0000A308 -#define BLIT_SIZE_WIDTH 15:0 -#define BLIT_SIZE_HEIGHT 31:16 - -#define RECT_FORMAT 0x0000C300 -#define RECT_FORMAT_DEPTH8 0x00000003 -#define RECT_FORMAT_DEPTH16 0x00000001 -#define RECT_FORMAT_DEPTH24 0x00000003 -#define RECT_SOLID_COLOR 0x0000C3FC -#define RECT_SOLID_RECTS_MAX_RECTS 32 -#define RECT_SOLID_RECTS(i) 0x0000C400\ - +(i)*8 -#define RECT_SOLID_RECTS_Y 15:0 -#define RECT_SOLID_RECTS_X 31:16 -#define RECT_SOLID_RECTS_HEIGHT 47:32 -#define RECT_SOLID_RECTS_WIDTH 63:48 - -#define RECT_EXPAND_ONE_COLOR_CLIP 0x0000C7EC -#define RECT_EXPAND_ONE_COLOR_CLIP_POINT0_X 15:0 -#define RECT_EXPAND_ONE_COLOR_CLIP_POINT0_Y 31:16 -#define RECT_EXPAND_ONE_COLOR_CLIP_POINT1_X 47:32 -#define RECT_EXPAND_ONE_COLOR_CLIP_POINT1_Y 63:48 -#define RECT_EXPAND_ONE_COLOR_COLOR 0x0000C7F4 -#define RECT_EXPAND_ONE_COLOR_SIZE 0x0000C7F8 -#define RECT_EXPAND_ONE_COLOR_SIZE_WIDTH 15:0 -#define RECT_EXPAND_ONE_COLOR_SIZE_HEIGHT 31:16 -#define RECT_EXPAND_ONE_COLOR_POINT 0x0000C7FC -#define RECT_EXPAND_ONE_COLOR_POINT_X 15:0 -#define RECT_EXPAND_ONE_COLOR_POINT_Y 31:16 -#define RECT_EXPAND_ONE_COLOR_DATA_MAX_DWORDS 128 -#define RECT_EXPAND_ONE_COLOR_DATA(i) 0x0000C800\ - +(i)*4 - -#define RECT_EXPAND_TWO_COLOR_CLIP 0x0000CBE4 -#define RECT_EXPAND_TWO_COLOR_CLIP_POINT0_X 15:0 -#define RECT_EXPAND_TWO_COLOR_CLIP_POINT0_Y 31:16 -#define RECT_EXPAND_TWO_COLOR_CLIP_POINT1_X 47:32 -#define RECT_EXPAND_TWO_COLOR_CLIP_POINT1_Y 63:48 -#define RECT_EXPAND_TWO_COLOR_COLOR_0 0x0000CBEC -#define RECT_EXPAND_TWO_COLOR_COLOR_1 0x0000CBF0 -#define RECT_EXPAND_TWO_COLOR_SIZE_IN 0x0000CBF4 -#define RECT_EXPAND_TWO_COLOR_SIZE_IN_WIDTH 15:0 -#define RECT_EXPAND_TWO_COLOR_SIZE_IN_HEIGHT 31:16 -#define RECT_EXPAND_TWO_COLOR_SIZE_OUT 0x0000CBF8 -#define RECT_EXPAND_TWO_COLOR_SIZE_OUT_WIDTH 15:0 -#define RECT_EXPAND_TWO_COLOR_SIZE_OUT_HEIGHT 31:16 -#define RECT_EXPAND_TWO_COLOR_POINT 0x0000CBFC -#define RECT_EXPAND_TWO_COLOR_POINT_X 15:0 -#define RECT_EXPAND_TWO_COLOR_POINT_Y 31:16 -#define RECT_EXPAND_TWO_COLOR_DATA_MAX_DWORDS 128 -#define RECT_EXPAND_TWO_COLOR_DATA(i) 0x0000CC00\ - +(i)*4 - -#define STRETCH_BLIT_FORMAT 0x0000E300 -#define STRETCH_BLIT_FORMAT_DEPTH8 0x00000004 -#define STRETCH_BLIT_FORMAT_DEPTH16 0x00000007 -#define STRETCH_BLIT_FORMAT_DEPTH24 0x00000004 -#define STRETCH_BLIT_FORMAT_X8R8G8B8 0x00000004 -#define STRETCH_BLIT_FORMAT_YUYV 0x00000005 -#define STRETCH_BLIT_FORMAT_UYVY 0x00000006 -#define STRETCH_BLIT_CLIP_POINT 0x0000E308 -#define STRETCH_BLIT_CLIP_POINT_X 15:0 -#define STRETCH_BLIT_CLIP_POINT_Y 31:16 -#define STRETCH_BLIT_CLIP_POINT 0x0000E308 -#define STRETCH_BLIT_CLIP_SIZE 0x0000E30C -#define STRETCH_BLIT_CLIP_SIZE_WIDTH 15:0 -#define STRETCH_BLIT_CLIP_SIZE_HEIGHT 31:16 -#define STRETCH_BLIT_DST_POINT 0x0000E310 -#define STRETCH_BLIT_DST_POINT_X 15:0 -#define STRETCH_BLIT_DST_POINT_Y 31:16 -#define STRETCH_BLIT_DST_SIZE 0x0000E314 -#define STRETCH_BLIT_DST_SIZE_WIDTH 15:0 -#define STRETCH_BLIT_DST_SIZE_HEIGHT 31:16 -#define STRETCH_BLIT_DU_DX 0x0000E318 -#define STRETCH_BLIT_DV_DY 0x0000E31C -#define STRETCH_BLIT_SRC_SIZE 0x0000E400 -#define STRETCH_BLIT_SRC_SIZE_WIDTH 15:0 -#define STRETCH_BLIT_SRC_SIZE_HEIGHT 31:16 -#define STRETCH_BLIT_SRC_FORMAT 0x0000E404 -#define STRETCH_BLIT_SRC_FORMAT_PITCH 15:0 -#define STRETCH_BLIT_SRC_FORMAT_ORIGIN 23:16 -#define STRETCH_BLIT_SRC_FORMAT_ORIGIN_CENTER 0x00000001 -#define STRETCH_BLIT_SRC_FORMAT_ORIGIN_CORNER 0x00000002 -#define STRETCH_BLIT_SRC_FORMAT_FILTER 31:24 -#define STRETCH_BLIT_SRC_FORMAT_FILTER_POINT_SAMPLE 0x00000000 -#define STRETCH_BLIT_SRC_FORMAT_FILTER_BILINEAR 0x00000001 -#define STRETCH_BLIT_SRC_OFFSET 0x0000E408 -#define STRETCH_BLIT_SRC_POINT 0x0000E40C -#define STRETCH_BLIT_SRC_POINT_U 15:0 -#define STRETCH_BLIT_SRC_POINT_V 31:16 diff --git a/drivers/video/fbdev/nvidia/nv_hw.c b/drivers/video/fbdev/nvidia/nv_hw.c deleted file mode 100644 index 9b0a324bb1b4..000000000000 --- a/drivers/video/fbdev/nvidia/nv_hw.c +++ /dev/null @@ -1,1688 +0,0 @@ - /***************************************************************************\ -|* *| -|* Copyright 1993-2003 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NOTICE TO USER: The source code is copyrighted under U.S. and *| -|* international laws. Users and possessors of this source code are *| -|* hereby granted a nonexclusive, royalty-free copyright license to *| -|* use this code in individual and commercial software. *| -|* *| -|* Any use of this source code must include, in the user documenta- *| -|* tion and internal comments to the code, notices to the end user *| -|* as follows: *| -|* *| -|* Copyright 1993-2003 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *| -|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *| -|* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *| -|* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *| -|* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *| -|* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *| -|* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *| -|* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *| -|* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *| -|* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *| -|* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *| -|* *| -|* U.S. Government End Users. This source code is a "commercial *| -|* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *| -|* consisting of "commercial computer software" and "commercial *| -|* computer software documentation," as such terms are used in *| -|* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *| -|* ment only as a commercial end item. Consistent with 48 C.F.R. *| -|* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *| -|* all U.S. Government End Users acquire the source code with only *| -|* those rights set forth herein. *| -|* *| - \***************************************************************************/ - -/* - * GPL Licensing Note - According to Mark Vojkovich, author of the Xorg/ - * XFree86 'nv' driver, this source code is provided under MIT-style licensing - * where the source code is provided "as is" without warranty of any kind. - * The only usage restriction is for the copyright notices to be retained - * whenever code is used. - * - * Antonino Daplas <adaplas@pol.net> 2005-03-11 - */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_hw.c,v 1.4 2003/11/03 05:11:25 tsi Exp $ */ - -#include <linux/pci.h> -#include "nv_type.h" -#include "nv_local.h" -#include "nv_proto.h" - -void NVLockUnlock(struct nvidia_par *par, int Lock) -{ - u8 cr11; - - VGA_WR08(par->PCIO, 0x3D4, 0x1F); - VGA_WR08(par->PCIO, 0x3D5, Lock ? 0x99 : 0x57); - - VGA_WR08(par->PCIO, 0x3D4, 0x11); - cr11 = VGA_RD08(par->PCIO, 0x3D5); - if (Lock) - cr11 |= 0x80; - else - cr11 &= ~0x80; - VGA_WR08(par->PCIO, 0x3D5, cr11); -} - -int NVShowHideCursor(struct nvidia_par *par, int ShowHide) -{ - int cur = par->CurrentState->cursor1; - - par->CurrentState->cursor1 = (par->CurrentState->cursor1 & 0xFE) | - (ShowHide & 0x01); - VGA_WR08(par->PCIO, 0x3D4, 0x31); - VGA_WR08(par->PCIO, 0x3D5, par->CurrentState->cursor1); - - if (par->Architecture == NV_ARCH_40) - NV_WR32(par->PRAMDAC, 0x0300, NV_RD32(par->PRAMDAC, 0x0300)); - - return (cur & 0x01); -} - -/****************************************************************************\ -* * -* The video arbitration routines calculate some "magic" numbers. Fixes * -* the snow seen when accessing the framebuffer without it. * -* It just works (I hope). * -* * -\****************************************************************************/ - -typedef struct { - int graphics_lwm; - int video_lwm; - int graphics_burst_size; - int video_burst_size; - int valid; -} nv4_fifo_info; - -typedef struct { - int pclk_khz; - int mclk_khz; - int nvclk_khz; - char mem_page_miss; - char mem_latency; - int memory_width; - char enable_video; - char gr_during_vid; - char pix_bpp; - char mem_aligned; - char enable_mp; -} nv4_sim_state; - -typedef struct { - int graphics_lwm; - int video_lwm; - int graphics_burst_size; - int video_burst_size; - int valid; -} nv10_fifo_info; - -typedef struct { - int pclk_khz; - int mclk_khz; - int nvclk_khz; - char mem_page_miss; - char mem_latency; - u32 memory_type; - int memory_width; - char enable_video; - char gr_during_vid; - char pix_bpp; - char mem_aligned; - char enable_mp; -} nv10_sim_state; - -static void nvGetClocks(struct nvidia_par *par, unsigned int *MClk, - unsigned int *NVClk) -{ - unsigned int pll, N, M, MB, NB, P; - - if (par->Architecture >= NV_ARCH_40) { - pll = NV_RD32(par->PMC, 0x4020); - P = (pll >> 16) & 0x07; - pll = NV_RD32(par->PMC, 0x4024); - M = pll & 0xFF; - N = (pll >> 8) & 0xFF; - if (((par->Chipset & 0xfff0) == 0x0290) || - ((par->Chipset & 0xfff0) == 0x0390)) { - MB = 1; - NB = 1; - } else { - MB = (pll >> 16) & 0xFF; - NB = (pll >> 24) & 0xFF; - } - *MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; - - pll = NV_RD32(par->PMC, 0x4000); - P = (pll >> 16) & 0x07; - pll = NV_RD32(par->PMC, 0x4004); - M = pll & 0xFF; - N = (pll >> 8) & 0xFF; - MB = (pll >> 16) & 0xFF; - NB = (pll >> 24) & 0xFF; - - *NVClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; - } else if (par->twoStagePLL) { - pll = NV_RD32(par->PRAMDAC0, 0x0504); - M = pll & 0xFF; - N = (pll >> 8) & 0xFF; - P = (pll >> 16) & 0x0F; - pll = NV_RD32(par->PRAMDAC0, 0x0574); - if (pll & 0x80000000) { - MB = pll & 0xFF; - NB = (pll >> 8) & 0xFF; - } else { - MB = 1; - NB = 1; - } - *MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; - - pll = NV_RD32(par->PRAMDAC0, 0x0500); - M = pll & 0xFF; - N = (pll >> 8) & 0xFF; - P = (pll >> 16) & 0x0F; - pll = NV_RD32(par->PRAMDAC0, 0x0570); - if (pll & 0x80000000) { - MB = pll & 0xFF; - NB = (pll >> 8) & 0xFF; - } else { - MB = 1; - NB = 1; - } - *NVClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; - } else - if (((par->Chipset & 0x0ff0) == 0x0300) || - ((par->Chipset & 0x0ff0) == 0x0330)) { - pll = NV_RD32(par->PRAMDAC0, 0x0504); - M = pll & 0x0F; - N = (pll >> 8) & 0xFF; - P = (pll >> 16) & 0x07; - if (pll & 0x00000080) { - MB = (pll >> 4) & 0x07; - NB = (pll >> 19) & 0x1f; - } else { - MB = 1; - NB = 1; - } - *MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; - - pll = NV_RD32(par->PRAMDAC0, 0x0500); - M = pll & 0x0F; - N = (pll >> 8) & 0xFF; - P = (pll >> 16) & 0x07; - if (pll & 0x00000080) { - MB = (pll >> 4) & 0x07; - NB = (pll >> 19) & 0x1f; - } else { - MB = 1; - NB = 1; - } - *NVClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; - } else { - pll = NV_RD32(par->PRAMDAC0, 0x0504); - M = pll & 0xFF; - N = (pll >> 8) & 0xFF; - P = (pll >> 16) & 0x0F; - *MClk = (N * par->CrystalFreqKHz / M) >> P; - - pll = NV_RD32(par->PRAMDAC0, 0x0500); - M = pll & 0xFF; - N = (pll >> 8) & 0xFF; - P = (pll >> 16) & 0x0F; - *NVClk = (N * par->CrystalFreqKHz / M) >> P; - } -} - -static void nv4CalcArbitration(nv4_fifo_info * fifo, nv4_sim_state * arb) -{ - int data, pagemiss, cas, width, video_enable, bpp; - int nvclks, mclks, pclks, vpagemiss, crtpagemiss, vbs; - int found, mclk_extra, mclk_loop, cbs, m1, p1; - int mclk_freq, pclk_freq, nvclk_freq, mp_enable; - int us_m, us_n, us_p, video_drain_rate, crtc_drain_rate; - int vpm_us, us_video, vlwm, video_fill_us, cpm_us, us_crt, clwm; - - fifo->valid = 1; - pclk_freq = arb->pclk_khz; - mclk_freq = arb->mclk_khz; - nvclk_freq = arb->nvclk_khz; - pagemiss = arb->mem_page_miss; - cas = arb->mem_latency; - width = arb->memory_width >> 6; - video_enable = arb->enable_video; - bpp = arb->pix_bpp; - mp_enable = arb->enable_mp; - clwm = 0; - vlwm = 0; - cbs = 128; - pclks = 2; - nvclks = 2; - nvclks += 2; - nvclks += 1; - mclks = 5; - mclks += 3; - mclks += 1; - mclks += cas; - mclks += 1; - mclks += 1; - mclks += 1; - mclks += 1; - mclk_extra = 3; - nvclks += 2; - nvclks += 1; - nvclks += 1; - nvclks += 1; - if (mp_enable) - mclks += 4; - nvclks += 0; - pclks += 0; - found = 0; - vbs = 0; - while (found != 1) { - fifo->valid = 1; - found = 1; - mclk_loop = mclks + mclk_extra; - us_m = mclk_loop * 1000 * 1000 / mclk_freq; - us_n = nvclks * 1000 * 1000 / nvclk_freq; - us_p = nvclks * 1000 * 1000 / pclk_freq; - if (video_enable) { - video_drain_rate = pclk_freq * 2; - crtc_drain_rate = pclk_freq * bpp / 8; - vpagemiss = 2; - vpagemiss += 1; - crtpagemiss = 2; - vpm_us = - (vpagemiss * pagemiss) * 1000 * 1000 / mclk_freq; - if (nvclk_freq * 2 > mclk_freq * width) - video_fill_us = - cbs * 1000 * 1000 / 16 / nvclk_freq; - else - video_fill_us = - cbs * 1000 * 1000 / (8 * width) / - mclk_freq; - us_video = vpm_us + us_m + us_n + us_p + video_fill_us; - vlwm = us_video * video_drain_rate / (1000 * 1000); - vlwm++; - vbs = 128; - if (vlwm > 128) - vbs = 64; - if (vlwm > (256 - 64)) - vbs = 32; - if (nvclk_freq * 2 > mclk_freq * width) - video_fill_us = - vbs * 1000 * 1000 / 16 / nvclk_freq; - else - video_fill_us = - vbs * 1000 * 1000 / (8 * width) / - mclk_freq; - cpm_us = - crtpagemiss * pagemiss * 1000 * 1000 / mclk_freq; - us_crt = - us_video + video_fill_us + cpm_us + us_m + us_n + - us_p; - clwm = us_crt * crtc_drain_rate / (1000 * 1000); - clwm++; - } else { - crtc_drain_rate = pclk_freq * bpp / 8; - crtpagemiss = 2; - crtpagemiss += 1; - cpm_us = - crtpagemiss * pagemiss * 1000 * 1000 / mclk_freq; - us_crt = cpm_us + us_m + us_n + us_p; - clwm = us_crt * crtc_drain_rate / (1000 * 1000); - clwm++; - } - m1 = clwm + cbs - 512; - p1 = m1 * pclk_freq / mclk_freq; - p1 = p1 * bpp / 8; - if ((p1 < m1) && (m1 > 0)) { - fifo->valid = 0; - found = 0; - if (mclk_extra == 0) - found = 1; - mclk_extra--; - } else if (video_enable) { - if ((clwm > 511) || (vlwm > 255)) { - fifo->valid = 0; - found = 0; - if (mclk_extra == 0) - found = 1; - mclk_extra--; - } - } else { - if (clwm > 519) { - fifo->valid = 0; - found = 0; - if (mclk_extra == 0) - found = 1; - mclk_extra--; - } - } - if (clwm < 384) - clwm = 384; - if (vlwm < 128) - vlwm = 128; - data = (int)(clwm); - fifo->graphics_lwm = data; - fifo->graphics_burst_size = 128; - data = (int)((vlwm + 15)); - fifo->video_lwm = data; - fifo->video_burst_size = vbs; - } -} - -static void nv4UpdateArbitrationSettings(unsigned VClk, - unsigned pixelDepth, - unsigned *burst, - unsigned *lwm, struct nvidia_par *par) -{ - nv4_fifo_info fifo_data; - nv4_sim_state sim_data; - unsigned int MClk, NVClk, cfg1; - - nvGetClocks(par, &MClk, &NVClk); - - cfg1 = NV_RD32(par->PFB, 0x00000204); - sim_data.pix_bpp = (char)pixelDepth; - sim_data.enable_video = 0; - sim_data.enable_mp = 0; - sim_data.memory_width = (NV_RD32(par->PEXTDEV, 0x0000) & 0x10) ? - 128 : 64; - sim_data.mem_latency = (char)cfg1 & 0x0F; - sim_data.mem_aligned = 1; - sim_data.mem_page_miss = - (char)(((cfg1 >> 4) & 0x0F) + ((cfg1 >> 31) & 0x01)); - sim_data.gr_during_vid = 0; - sim_data.pclk_khz = VClk; - sim_data.mclk_khz = MClk; - sim_data.nvclk_khz = NVClk; - nv4CalcArbitration(&fifo_data, &sim_data); - if (fifo_data.valid) { - int b = fifo_data.graphics_burst_size >> 4; - *burst = 0; - while (b >>= 1) - (*burst)++; - *lwm = fifo_data.graphics_lwm >> 3; - } -} - -static void nv10CalcArbitration(nv10_fifo_info * fifo, nv10_sim_state * arb) -{ - int data, pagemiss, width, video_enable, bpp; - int nvclks, mclks, pclks, vpagemiss, crtpagemiss; - int nvclk_fill; - int found, mclk_extra, mclk_loop, cbs, m1; - int mclk_freq, pclk_freq, nvclk_freq, mp_enable; - int us_m, us_m_min, us_n, us_p, crtc_drain_rate; - int vus_m; - int vpm_us, us_video, cpm_us, us_crt, clwm; - int clwm_rnd_down; - int m2us, us_pipe_min, p1clk, p2; - int min_mclk_extra; - int us_min_mclk_extra; - - fifo->valid = 1; - pclk_freq = arb->pclk_khz; /* freq in KHz */ - mclk_freq = arb->mclk_khz; - nvclk_freq = arb->nvclk_khz; - pagemiss = arb->mem_page_miss; - width = arb->memory_width / 64; - video_enable = arb->enable_video; - bpp = arb->pix_bpp; - mp_enable = arb->enable_mp; - clwm = 0; - - cbs = 512; - - pclks = 4; /* lwm detect. */ - - nvclks = 3; /* lwm -> sync. */ - nvclks += 2; /* fbi bus cycles (1 req + 1 busy) */ - /* 2 edge sync. may be very close to edge so just put one. */ - mclks = 1; - mclks += 1; /* arb_hp_req */ - mclks += 5; /* ap_hp_req tiling pipeline */ - - mclks += 2; /* tc_req latency fifo */ - mclks += 2; /* fb_cas_n_ memory request to fbio block */ - mclks += 7; /* sm_d_rdv data returned from fbio block */ - - /* fb.rd.d.Put_gc need to accumulate 256 bits for read */ - if (arb->memory_type == 0) - if (arb->memory_width == 64) /* 64 bit bus */ - mclks += 4; - else - mclks += 2; - else if (arb->memory_width == 64) /* 64 bit bus */ - mclks += 2; - else - mclks += 1; - - if ((!video_enable) && (arb->memory_width == 128)) { - mclk_extra = (bpp == 32) ? 31 : 42; /* Margin of error */ - min_mclk_extra = 17; - } else { - mclk_extra = (bpp == 32) ? 8 : 4; /* Margin of error */ - /* mclk_extra = 4; *//* Margin of error */ - min_mclk_extra = 18; - } - - /* 2 edge sync. may be very close to edge so just put one. */ - nvclks += 1; - nvclks += 1; /* fbi_d_rdv_n */ - nvclks += 1; /* Fbi_d_rdata */ - nvclks += 1; /* crtfifo load */ - - if (mp_enable) - mclks += 4; /* Mp can get in with a burst of 8. */ - /* Extra clocks determined by heuristics */ - - nvclks += 0; - pclks += 0; - found = 0; - while (found != 1) { - fifo->valid = 1; - found = 1; - mclk_loop = mclks + mclk_extra; - /* Mclk latency in us */ - us_m = mclk_loop * 1000 * 1000 / mclk_freq; - /* Minimum Mclk latency in us */ - us_m_min = mclks * 1000 * 1000 / mclk_freq; - us_min_mclk_extra = min_mclk_extra * 1000 * 1000 / mclk_freq; - /* nvclk latency in us */ - us_n = nvclks * 1000 * 1000 / nvclk_freq; - /* nvclk latency in us */ - us_p = pclks * 1000 * 1000 / pclk_freq; - us_pipe_min = us_m_min + us_n + us_p; - - /* Mclk latency in us */ - vus_m = mclk_loop * 1000 * 1000 / mclk_freq; - - if (video_enable) { - crtc_drain_rate = pclk_freq * bpp / 8; /* MB/s */ - - vpagemiss = 1; /* self generating page miss */ - vpagemiss += 1; /* One higher priority before */ - - crtpagemiss = 2; /* self generating page miss */ - if (mp_enable) - crtpagemiss += 1; /* if MA0 conflict */ - - vpm_us = - (vpagemiss * pagemiss) * 1000 * 1000 / mclk_freq; - - /* Video has separate read return path */ - us_video = vpm_us + vus_m; - - cpm_us = - crtpagemiss * pagemiss * 1000 * 1000 / mclk_freq; - /* Wait for video */ - us_crt = us_video - + cpm_us /* CRT Page miss */ - + us_m + us_n + us_p /* other latency */ - ; - - clwm = us_crt * crtc_drain_rate / (1000 * 1000); - /* fixed point <= float_point - 1. Fixes that */ - clwm++; - } else { - /* bpp * pclk/8 */ - crtc_drain_rate = pclk_freq * bpp / 8; - - crtpagemiss = 1; /* self generating page miss */ - crtpagemiss += 1; /* MA0 page miss */ - if (mp_enable) - crtpagemiss += 1; /* if MA0 conflict */ - cpm_us = - crtpagemiss * pagemiss * 1000 * 1000 / mclk_freq; - us_crt = cpm_us + us_m + us_n + us_p; - clwm = us_crt * crtc_drain_rate / (1000 * 1000); - /* fixed point <= float_point - 1. Fixes that */ - clwm++; - - /* Finally, a heuristic check when width == 64 bits */ - if (width == 1) { - nvclk_fill = nvclk_freq * 8; - if (crtc_drain_rate * 100 >= nvclk_fill * 102) - /*Large number to fail */ - clwm = 0xfff; - - else if (crtc_drain_rate * 100 >= - nvclk_fill * 98) { - clwm = 1024; - cbs = 512; - } - } - } - - /* - Overfill check: - */ - - clwm_rnd_down = ((int)clwm / 8) * 8; - if (clwm_rnd_down < clwm) - clwm += 8; - - m1 = clwm + cbs - 1024; /* Amount of overfill */ - m2us = us_pipe_min + us_min_mclk_extra; - - /* pclk cycles to drain */ - p1clk = m2us * pclk_freq / (1000 * 1000); - p2 = p1clk * bpp / 8; /* bytes drained. */ - - if ((p2 < m1) && (m1 > 0)) { - fifo->valid = 0; - found = 0; - if (min_mclk_extra == 0) { - if (cbs <= 32) { - /* Can't adjust anymore! */ - found = 1; - } else { - /* reduce the burst size */ - cbs = cbs / 2; - } - } else { - min_mclk_extra--; - } - } else { - if (clwm > 1023) { /* Have some margin */ - fifo->valid = 0; - found = 0; - if (min_mclk_extra == 0) - /* Can't adjust anymore! */ - found = 1; - else - min_mclk_extra--; - } - } - - if (clwm < (1024 - cbs + 8)) - clwm = 1024 - cbs + 8; - data = (int)(clwm); - /* printf("CRT LWM: %f bytes, prog: 0x%x, bs: 256\n", - clwm, data ); */ - fifo->graphics_lwm = data; - fifo->graphics_burst_size = cbs; - - fifo->video_lwm = 1024; - fifo->video_burst_size = 512; - } -} - -static void nv10UpdateArbitrationSettings(unsigned VClk, - unsigned pixelDepth, - unsigned *burst, - unsigned *lwm, - struct nvidia_par *par) -{ - nv10_fifo_info fifo_data; - nv10_sim_state sim_data; - unsigned int MClk, NVClk, cfg1; - - nvGetClocks(par, &MClk, &NVClk); - - cfg1 = NV_RD32(par->PFB, 0x0204); - sim_data.pix_bpp = (char)pixelDepth; - sim_data.enable_video = 1; - sim_data.enable_mp = 0; - sim_data.memory_type = (NV_RD32(par->PFB, 0x0200) & 0x01) ? 1 : 0; - sim_data.memory_width = (NV_RD32(par->PEXTDEV, 0x0000) & 0x10) ? - 128 : 64; - sim_data.mem_latency = (char)cfg1 & 0x0F; - sim_data.mem_aligned = 1; - sim_data.mem_page_miss = - (char)(((cfg1 >> 4) & 0x0F) + ((cfg1 >> 31) & 0x01)); - sim_data.gr_during_vid = 0; - sim_data.pclk_khz = VClk; - sim_data.mclk_khz = MClk; - sim_data.nvclk_khz = NVClk; - nv10CalcArbitration(&fifo_data, &sim_data); - if (fifo_data.valid) { - int b = fifo_data.graphics_burst_size >> 4; - *burst = 0; - while (b >>= 1) - (*burst)++; - *lwm = fifo_data.graphics_lwm >> 3; - } -} - -static void nv30UpdateArbitrationSettings ( - struct nvidia_par *par, - unsigned int *burst, - unsigned int *lwm -) -{ - unsigned int MClk, NVClk; - unsigned int fifo_size, burst_size, graphics_lwm; - - fifo_size = 2048; - burst_size = 512; - graphics_lwm = fifo_size - burst_size; - - nvGetClocks(par, &MClk, &NVClk); - - *burst = 0; - burst_size >>= 5; - while(burst_size >>= 1) (*burst)++; - *lwm = graphics_lwm >> 3; -} - -static void nForceUpdateArbitrationSettings(unsigned VClk, - unsigned pixelDepth, - unsigned *burst, - unsigned *lwm, - struct nvidia_par *par) -{ - nv10_fifo_info fifo_data; - nv10_sim_state sim_data; - unsigned int M, N, P, pll, MClk, NVClk, memctrl; - struct pci_dev *dev; - int domain = pci_domain_nr(par->pci_dev->bus); - - if ((par->Chipset & 0x0FF0) == 0x01A0) { - unsigned int uMClkPostDiv; - dev = pci_get_domain_bus_and_slot(domain, 0, 3); - pci_read_config_dword(dev, 0x6C, &uMClkPostDiv); - uMClkPostDiv = (uMClkPostDiv >> 8) & 0xf; - - if (!uMClkPostDiv) - uMClkPostDiv = 4; - MClk = 400000 / uMClkPostDiv; - } else { - dev = pci_get_domain_bus_and_slot(domain, 0, 5); - pci_read_config_dword(dev, 0x4c, &MClk); - MClk /= 1000; - } - pci_dev_put(dev); - pll = NV_RD32(par->PRAMDAC0, 0x0500); - M = (pll >> 0) & 0xFF; - N = (pll >> 8) & 0xFF; - P = (pll >> 16) & 0x0F; - NVClk = (N * par->CrystalFreqKHz / M) >> P; - sim_data.pix_bpp = (char)pixelDepth; - sim_data.enable_video = 0; - sim_data.enable_mp = 0; - dev = pci_get_domain_bus_and_slot(domain, 0, 1); - pci_read_config_dword(dev, 0x7C, &sim_data.memory_type); - pci_dev_put(dev); - sim_data.memory_type = (sim_data.memory_type >> 12) & 1; - sim_data.memory_width = 64; - - dev = pci_get_domain_bus_and_slot(domain, 0, 3); - pci_read_config_dword(dev, 0, &memctrl); - pci_dev_put(dev); - memctrl >>= 16; - - if ((memctrl == 0x1A9) || (memctrl == 0x1AB) || (memctrl == 0x1ED)) { - u32 dimm[3]; - - dev = pci_get_domain_bus_and_slot(domain, 0, 2); - pci_read_config_dword(dev, 0x40, &dimm[0]); - dimm[0] = (dimm[0] >> 8) & 0x4f; - pci_read_config_dword(dev, 0x44, &dimm[1]); - dimm[1] = (dimm[1] >> 8) & 0x4f; - pci_read_config_dword(dev, 0x48, &dimm[2]); - dimm[2] = (dimm[2] >> 8) & 0x4f; - - if ((dimm[0] + dimm[1]) != dimm[2]) { - printk("nvidiafb: your nForce DIMMs are not arranged " - "in optimal banks!\n"); - } - pci_dev_put(dev); - } - - sim_data.mem_latency = 3; - sim_data.mem_aligned = 1; - sim_data.mem_page_miss = 10; - sim_data.gr_during_vid = 0; - sim_data.pclk_khz = VClk; - sim_data.mclk_khz = MClk; - sim_data.nvclk_khz = NVClk; - nv10CalcArbitration(&fifo_data, &sim_data); - if (fifo_data.valid) { - int b = fifo_data.graphics_burst_size >> 4; - *burst = 0; - while (b >>= 1) - (*burst)++; - *lwm = fifo_data.graphics_lwm >> 3; - } -} - -/****************************************************************************\ -* * -* RIVA Mode State Routines * -* * -\****************************************************************************/ - -/* - * Calculate the Video Clock parameters for the PLL. - */ -static void CalcVClock(int clockIn, - int *clockOut, u32 * pllOut, struct nvidia_par *par) -{ - unsigned lowM, highM; - unsigned DeltaNew, DeltaOld; - unsigned VClk, Freq; - unsigned M, N, P; - - DeltaOld = 0xFFFFFFFF; - - VClk = (unsigned)clockIn; - - if (par->CrystalFreqKHz == 13500) { - lowM = 7; - highM = 13; - } else { - lowM = 8; - highM = 14; - } - - for (P = 0; P <= 4; P++) { - Freq = VClk << P; - if ((Freq >= 128000) && (Freq <= 350000)) { - for (M = lowM; M <= highM; M++) { - N = ((VClk << P) * M) / par->CrystalFreqKHz; - if (N <= 255) { - Freq = - ((par->CrystalFreqKHz * N) / - M) >> P; - if (Freq > VClk) - DeltaNew = Freq - VClk; - else - DeltaNew = VClk - Freq; - if (DeltaNew < DeltaOld) { - *pllOut = - (P << 16) | (N << 8) | M; - *clockOut = Freq; - DeltaOld = DeltaNew; - } - } - } - } - } -} - -static void CalcVClock2Stage(int clockIn, - int *clockOut, - u32 * pllOut, - u32 * pllBOut, struct nvidia_par *par) -{ - unsigned DeltaNew, DeltaOld; - unsigned VClk, Freq; - unsigned M, N, P; - - DeltaOld = 0xFFFFFFFF; - - *pllBOut = 0x80000401; /* fixed at x4 for now */ - - VClk = (unsigned)clockIn; - - for (P = 0; P <= 6; P++) { - Freq = VClk << P; - if ((Freq >= 400000) && (Freq <= 1000000)) { - for (M = 1; M <= 13; M++) { - N = ((VClk << P) * M) / - (par->CrystalFreqKHz << 2); - if ((N >= 5) && (N <= 255)) { - Freq = - (((par->CrystalFreqKHz << 2) * N) / - M) >> P; - if (Freq > VClk) - DeltaNew = Freq - VClk; - else - DeltaNew = VClk - Freq; - if (DeltaNew < DeltaOld) { - *pllOut = - (P << 16) | (N << 8) | M; - *clockOut = Freq; - DeltaOld = DeltaNew; - } - } - } - } - } -} - -/* - * Calculate extended mode parameters (SVGA) and save in a - * mode state structure. - */ -void NVCalcStateExt(struct nvidia_par *par, - RIVA_HW_STATE * state, - int bpp, - int width, - int hDisplaySize, int height, int dotClock, int flags) -{ - int pixelDepth, VClk = 0; - /* - * Save mode parameters. - */ - state->bpp = bpp; /* this is not bitsPerPixel, it's 8,15,16,32 */ - state->width = width; - state->height = height; - /* - * Extended RIVA registers. - */ - pixelDepth = (bpp + 1) / 8; - if (par->twoStagePLL) - CalcVClock2Stage(dotClock, &VClk, &state->pll, &state->pllB, - par); - else - CalcVClock(dotClock, &VClk, &state->pll, par); - - switch (par->Architecture) { - case NV_ARCH_04: - nv4UpdateArbitrationSettings(VClk, - pixelDepth * 8, - &(state->arbitration0), - &(state->arbitration1), par); - state->cursor0 = 0x00; - state->cursor1 = 0xbC; - if (flags & FB_VMODE_DOUBLE) - state->cursor1 |= 2; - state->cursor2 = 0x00000000; - state->pllsel = 0x10000700; - state->config = 0x00001114; - state->general = bpp == 16 ? 0x00101100 : 0x00100100; - state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; - break; - case NV_ARCH_40: - if (!par->FlatPanel) - state->control = NV_RD32(par->PRAMDAC0, 0x0580) & - 0xeffffeff; - fallthrough; - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - default: - if ((par->Chipset & 0xfff0) == 0x0240 || - (par->Chipset & 0xfff0) == 0x03d0) { - state->arbitration0 = 256; - state->arbitration1 = 0x0480; - } else if (((par->Chipset & 0xffff) == 0x01A0) || - ((par->Chipset & 0xffff) == 0x01f0)) { - nForceUpdateArbitrationSettings(VClk, - pixelDepth * 8, - &(state->arbitration0), - &(state->arbitration1), - par); - } else if (par->Architecture < NV_ARCH_30) { - nv10UpdateArbitrationSettings(VClk, - pixelDepth * 8, - &(state->arbitration0), - &(state->arbitration1), - par); - } else { - nv30UpdateArbitrationSettings(par, - &(state->arbitration0), - &(state->arbitration1)); - } - - state->cursor0 = 0x80 | (par->CursorStart >> 17); - state->cursor1 = (par->CursorStart >> 11) << 2; - state->cursor2 = par->CursorStart >> 24; - if (flags & FB_VMODE_DOUBLE) - state->cursor1 |= 2; - state->pllsel = 0x10000700; - state->config = NV_RD32(par->PFB, 0x00000200); - state->general = bpp == 16 ? 0x00101100 : 0x00100100; - state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; - break; - } - - if (bpp != 8) /* DirectColor */ - state->general |= 0x00000030; - - state->repaint0 = (((width / 8) * pixelDepth) & 0x700) >> 3; - state->pixel = (pixelDepth > 2) ? 3 : pixelDepth; -} - -void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) -{ - int i, j; - - NV_WR32(par->PMC, 0x0140, 0x00000000); - NV_WR32(par->PMC, 0x0200, 0xFFFF00FF); - NV_WR32(par->PMC, 0x0200, 0xFFFFFFFF); - - NV_WR32(par->PTIMER, 0x0200 * 4, 0x00000008); - NV_WR32(par->PTIMER, 0x0210 * 4, 0x00000003); - NV_WR32(par->PTIMER, 0x0140 * 4, 0x00000000); - NV_WR32(par->PTIMER, 0x0100 * 4, 0xFFFFFFFF); - - if (par->Architecture == NV_ARCH_04) { - if (state) - NV_WR32(par->PFB, 0x0200, state->config); - } else if ((par->Architecture < NV_ARCH_40) || - (par->Chipset & 0xfff0) == 0x0040) { - for (i = 0; i < 8; i++) { - NV_WR32(par->PFB, 0x0240 + (i * 0x10), 0); - NV_WR32(par->PFB, 0x0244 + (i * 0x10), - par->FbMapSize - 1); - } - } else { - int regions = 12; - - if (((par->Chipset & 0xfff0) == 0x0090) || - ((par->Chipset & 0xfff0) == 0x01D0) || - ((par->Chipset & 0xfff0) == 0x0290) || - ((par->Chipset & 0xfff0) == 0x0390) || - ((par->Chipset & 0xfff0) == 0x03D0)) - regions = 15; - for(i = 0; i < regions; i++) { - NV_WR32(par->PFB, 0x0600 + (i * 0x10), 0); - NV_WR32(par->PFB, 0x0604 + (i * 0x10), - par->FbMapSize - 1); - } - } - - if (par->Architecture >= NV_ARCH_40) { - NV_WR32(par->PRAMIN, 0x0000 * 4, 0x80000010); - NV_WR32(par->PRAMIN, 0x0001 * 4, 0x00101202); - NV_WR32(par->PRAMIN, 0x0002 * 4, 0x80000011); - NV_WR32(par->PRAMIN, 0x0003 * 4, 0x00101204); - NV_WR32(par->PRAMIN, 0x0004 * 4, 0x80000012); - NV_WR32(par->PRAMIN, 0x0005 * 4, 0x00101206); - NV_WR32(par->PRAMIN, 0x0006 * 4, 0x80000013); - NV_WR32(par->PRAMIN, 0x0007 * 4, 0x00101208); - NV_WR32(par->PRAMIN, 0x0008 * 4, 0x80000014); - NV_WR32(par->PRAMIN, 0x0009 * 4, 0x0010120A); - NV_WR32(par->PRAMIN, 0x000A * 4, 0x80000015); - NV_WR32(par->PRAMIN, 0x000B * 4, 0x0010120C); - NV_WR32(par->PRAMIN, 0x000C * 4, 0x80000016); - NV_WR32(par->PRAMIN, 0x000D * 4, 0x0010120E); - NV_WR32(par->PRAMIN, 0x000E * 4, 0x80000017); - NV_WR32(par->PRAMIN, 0x000F * 4, 0x00101210); - NV_WR32(par->PRAMIN, 0x0800 * 4, 0x00003000); - NV_WR32(par->PRAMIN, 0x0801 * 4, par->FbMapSize - 1); - NV_WR32(par->PRAMIN, 0x0802 * 4, 0x00000002); - NV_WR32(par->PRAMIN, 0x0808 * 4, 0x02080062); - NV_WR32(par->PRAMIN, 0x0809 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x080A * 4, 0x00001200); - NV_WR32(par->PRAMIN, 0x080B * 4, 0x00001200); - NV_WR32(par->PRAMIN, 0x080C * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x080D * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0810 * 4, 0x02080043); - NV_WR32(par->PRAMIN, 0x0811 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0812 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0813 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0814 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0815 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0818 * 4, 0x02080044); - NV_WR32(par->PRAMIN, 0x0819 * 4, 0x02000000); - NV_WR32(par->PRAMIN, 0x081A * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x081B * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x081C * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x081D * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0820 * 4, 0x02080019); - NV_WR32(par->PRAMIN, 0x0821 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0822 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0823 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0824 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0825 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0828 * 4, 0x020A005C); - NV_WR32(par->PRAMIN, 0x0829 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x082A * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x082B * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x082C * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x082D * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0830 * 4, 0x0208009F); - NV_WR32(par->PRAMIN, 0x0831 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0832 * 4, 0x00001200); - NV_WR32(par->PRAMIN, 0x0833 * 4, 0x00001200); - NV_WR32(par->PRAMIN, 0x0834 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0835 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0838 * 4, 0x0208004A); - NV_WR32(par->PRAMIN, 0x0839 * 4, 0x02000000); - NV_WR32(par->PRAMIN, 0x083A * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x083B * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x083C * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x083D * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0840 * 4, 0x02080077); - NV_WR32(par->PRAMIN, 0x0841 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0842 * 4, 0x00001200); - NV_WR32(par->PRAMIN, 0x0843 * 4, 0x00001200); - NV_WR32(par->PRAMIN, 0x0844 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0845 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x084C * 4, 0x00003002); - NV_WR32(par->PRAMIN, 0x084D * 4, 0x00007FFF); - NV_WR32(par->PRAMIN, 0x084E * 4, - par->FbUsableSize | 0x00000002); - -#ifdef __BIG_ENDIAN - NV_WR32(par->PRAMIN, 0x080A * 4, - NV_RD32(par->PRAMIN, 0x080A * 4) | 0x01000000); - NV_WR32(par->PRAMIN, 0x0812 * 4, - NV_RD32(par->PRAMIN, 0x0812 * 4) | 0x01000000); - NV_WR32(par->PRAMIN, 0x081A * 4, - NV_RD32(par->PRAMIN, 0x081A * 4) | 0x01000000); - NV_WR32(par->PRAMIN, 0x0822 * 4, - NV_RD32(par->PRAMIN, 0x0822 * 4) | 0x01000000); - NV_WR32(par->PRAMIN, 0x082A * 4, - NV_RD32(par->PRAMIN, 0x082A * 4) | 0x01000000); - NV_WR32(par->PRAMIN, 0x0832 * 4, - NV_RD32(par->PRAMIN, 0x0832 * 4) | 0x01000000); - NV_WR32(par->PRAMIN, 0x083A * 4, - NV_RD32(par->PRAMIN, 0x083A * 4) | 0x01000000); - NV_WR32(par->PRAMIN, 0x0842 * 4, - NV_RD32(par->PRAMIN, 0x0842 * 4) | 0x01000000); - NV_WR32(par->PRAMIN, 0x0819 * 4, 0x01000000); - NV_WR32(par->PRAMIN, 0x0839 * 4, 0x01000000); -#endif - } else { - NV_WR32(par->PRAMIN, 0x0000 * 4, 0x80000010); - NV_WR32(par->PRAMIN, 0x0001 * 4, 0x80011201); - NV_WR32(par->PRAMIN, 0x0002 * 4, 0x80000011); - NV_WR32(par->PRAMIN, 0x0003 * 4, 0x80011202); - NV_WR32(par->PRAMIN, 0x0004 * 4, 0x80000012); - NV_WR32(par->PRAMIN, 0x0005 * 4, 0x80011203); - NV_WR32(par->PRAMIN, 0x0006 * 4, 0x80000013); - NV_WR32(par->PRAMIN, 0x0007 * 4, 0x80011204); - NV_WR32(par->PRAMIN, 0x0008 * 4, 0x80000014); - NV_WR32(par->PRAMIN, 0x0009 * 4, 0x80011205); - NV_WR32(par->PRAMIN, 0x000A * 4, 0x80000015); - NV_WR32(par->PRAMIN, 0x000B * 4, 0x80011206); - NV_WR32(par->PRAMIN, 0x000C * 4, 0x80000016); - NV_WR32(par->PRAMIN, 0x000D * 4, 0x80011207); - NV_WR32(par->PRAMIN, 0x000E * 4, 0x80000017); - NV_WR32(par->PRAMIN, 0x000F * 4, 0x80011208); - NV_WR32(par->PRAMIN, 0x0800 * 4, 0x00003000); - NV_WR32(par->PRAMIN, 0x0801 * 4, par->FbMapSize - 1); - NV_WR32(par->PRAMIN, 0x0802 * 4, 0x00000002); - NV_WR32(par->PRAMIN, 0x0803 * 4, 0x00000002); - if (par->Architecture >= NV_ARCH_10) - NV_WR32(par->PRAMIN, 0x0804 * 4, 0x01008062); - else - NV_WR32(par->PRAMIN, 0x0804 * 4, 0x01008042); - NV_WR32(par->PRAMIN, 0x0805 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0806 * 4, 0x12001200); - NV_WR32(par->PRAMIN, 0x0807 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0808 * 4, 0x01008043); - NV_WR32(par->PRAMIN, 0x0809 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x080A * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x080B * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x080C * 4, 0x01008044); - NV_WR32(par->PRAMIN, 0x080D * 4, 0x00000002); - NV_WR32(par->PRAMIN, 0x080E * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x080F * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0810 * 4, 0x01008019); - NV_WR32(par->PRAMIN, 0x0811 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0812 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0813 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0814 * 4, 0x0100A05C); - NV_WR32(par->PRAMIN, 0x0815 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0816 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0817 * 4, 0x00000000); - if (par->WaitVSyncPossible) - NV_WR32(par->PRAMIN, 0x0818 * 4, 0x0100809F); - else - NV_WR32(par->PRAMIN, 0x0818 * 4, 0x0100805F); - NV_WR32(par->PRAMIN, 0x0819 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x081A * 4, 0x12001200); - NV_WR32(par->PRAMIN, 0x081B * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x081C * 4, 0x0100804A); - NV_WR32(par->PRAMIN, 0x081D * 4, 0x00000002); - NV_WR32(par->PRAMIN, 0x081E * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x081F * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0820 * 4, 0x01018077); - NV_WR32(par->PRAMIN, 0x0821 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0822 * 4, 0x12001200); - NV_WR32(par->PRAMIN, 0x0823 * 4, 0x00000000); - NV_WR32(par->PRAMIN, 0x0824 * 4, 0x00003002); - NV_WR32(par->PRAMIN, 0x0825 * 4, 0x00007FFF); - NV_WR32(par->PRAMIN, 0x0826 * 4, - par->FbUsableSize | 0x00000002); - NV_WR32(par->PRAMIN, 0x0827 * 4, 0x00000002); -#ifdef __BIG_ENDIAN - NV_WR32(par->PRAMIN, 0x0804 * 4, - NV_RD32(par->PRAMIN, 0x0804 * 4) | 0x00080000); - NV_WR32(par->PRAMIN, 0x0808 * 4, - NV_RD32(par->PRAMIN, 0x0808 * 4) | 0x00080000); - NV_WR32(par->PRAMIN, 0x080C * 4, - NV_RD32(par->PRAMIN, 0x080C * 4) | 0x00080000); - NV_WR32(par->PRAMIN, 0x0810 * 4, - NV_RD32(par->PRAMIN, 0x0810 * 4) | 0x00080000); - NV_WR32(par->PRAMIN, 0x0814 * 4, - NV_RD32(par->PRAMIN, 0x0814 * 4) | 0x00080000); - NV_WR32(par->PRAMIN, 0x0818 * 4, - NV_RD32(par->PRAMIN, 0x0818 * 4) | 0x00080000); - NV_WR32(par->PRAMIN, 0x081C * 4, - NV_RD32(par->PRAMIN, 0x081C * 4) | 0x00080000); - NV_WR32(par->PRAMIN, 0x0820 * 4, - NV_RD32(par->PRAMIN, 0x0820 * 4) | 0x00080000); - NV_WR32(par->PRAMIN, 0x080D * 4, 0x00000001); - NV_WR32(par->PRAMIN, 0x081D * 4, 0x00000001); -#endif - } - if (par->Architecture < NV_ARCH_10) { - if ((par->Chipset & 0x0fff) == 0x0020) { - NV_WR32(par->PRAMIN, 0x0824 * 4, - NV_RD32(par->PRAMIN, 0x0824 * 4) | 0x00020000); - NV_WR32(par->PRAMIN, 0x0826 * 4, - NV_RD32(par->PRAMIN, - 0x0826 * 4) + par->FbAddress); - } - NV_WR32(par->PGRAPH, 0x0080, 0x000001FF); - NV_WR32(par->PGRAPH, 0x0080, 0x1230C000); - NV_WR32(par->PGRAPH, 0x0084, 0x72111101); - NV_WR32(par->PGRAPH, 0x0088, 0x11D5F071); - NV_WR32(par->PGRAPH, 0x008C, 0x0004FF31); - NV_WR32(par->PGRAPH, 0x008C, 0x4004FF31); - NV_WR32(par->PGRAPH, 0x0140, 0x00000000); - NV_WR32(par->PGRAPH, 0x0100, 0xFFFFFFFF); - NV_WR32(par->PGRAPH, 0x0170, 0x10010100); - NV_WR32(par->PGRAPH, 0x0710, 0xFFFFFFFF); - NV_WR32(par->PGRAPH, 0x0720, 0x00000001); - NV_WR32(par->PGRAPH, 0x0810, 0x00000000); - NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF); - } else { - NV_WR32(par->PGRAPH, 0x0080, 0xFFFFFFFF); - NV_WR32(par->PGRAPH, 0x0080, 0x00000000); - - NV_WR32(par->PGRAPH, 0x0140, 0x00000000); - NV_WR32(par->PGRAPH, 0x0100, 0xFFFFFFFF); - NV_WR32(par->PGRAPH, 0x0144, 0x10010100); - NV_WR32(par->PGRAPH, 0x0714, 0xFFFFFFFF); - NV_WR32(par->PGRAPH, 0x0720, 0x00000001); - NV_WR32(par->PGRAPH, 0x0710, - NV_RD32(par->PGRAPH, 0x0710) & 0x0007ff00); - NV_WR32(par->PGRAPH, 0x0710, - NV_RD32(par->PGRAPH, 0x0710) | 0x00020100); - - if (par->Architecture == NV_ARCH_10) { - NV_WR32(par->PGRAPH, 0x0084, 0x00118700); - NV_WR32(par->PGRAPH, 0x0088, 0x24E00810); - NV_WR32(par->PGRAPH, 0x008C, 0x55DE0030); - - for (i = 0; i < 32; i++) - NV_WR32(&par->PGRAPH[(0x0B00 / 4) + i], 0, - NV_RD32(&par->PFB[(0x0240 / 4) + i], - 0)); - - NV_WR32(par->PGRAPH, 0x640, 0); - NV_WR32(par->PGRAPH, 0x644, 0); - NV_WR32(par->PGRAPH, 0x684, par->FbMapSize - 1); - NV_WR32(par->PGRAPH, 0x688, par->FbMapSize - 1); - - NV_WR32(par->PGRAPH, 0x0810, 0x00000000); - NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF); - } else { - if (par->Architecture >= NV_ARCH_40) { - NV_WR32(par->PGRAPH, 0x0084, 0x401287c0); - NV_WR32(par->PGRAPH, 0x008C, 0x60de8051); - NV_WR32(par->PGRAPH, 0x0090, 0x00008000); - NV_WR32(par->PGRAPH, 0x0610, 0x00be3c5f); - NV_WR32(par->PGRAPH, 0x0bc4, - NV_RD32(par->PGRAPH, 0x0bc4) | - 0x00008000); - - j = NV_RD32(par->REGS, 0x1540) & 0xff; - - if (j) { - for (i = 0; !(j & 1); j >>= 1, i++); - NV_WR32(par->PGRAPH, 0x5000, i); - } - - if ((par->Chipset & 0xfff0) == 0x0040) { - NV_WR32(par->PGRAPH, 0x09b0, - 0x83280fff); - NV_WR32(par->PGRAPH, 0x09b4, - 0x000000a0); - } else { - NV_WR32(par->PGRAPH, 0x0820, - 0x83280eff); - NV_WR32(par->PGRAPH, 0x0824, - 0x000000a0); - } - - switch (par->Chipset & 0xfff0) { - case 0x0040: - case 0x0210: - NV_WR32(par->PGRAPH, 0x09b8, - 0x0078e366); - NV_WR32(par->PGRAPH, 0x09bc, - 0x0000014c); - NV_WR32(par->PFB, 0x033C, - NV_RD32(par->PFB, 0x33C) & - 0xffff7fff); - break; - case 0x00C0: - case 0x0120: - NV_WR32(par->PGRAPH, 0x0828, - 0x007596ff); - NV_WR32(par->PGRAPH, 0x082C, - 0x00000108); - break; - case 0x0160: - case 0x01D0: - case 0x0240: - case 0x03D0: - NV_WR32(par->PMC, 0x1700, - NV_RD32(par->PFB, 0x020C)); - NV_WR32(par->PMC, 0x1704, 0); - NV_WR32(par->PMC, 0x1708, 0); - NV_WR32(par->PMC, 0x170C, - NV_RD32(par->PFB, 0x020C)); - NV_WR32(par->PGRAPH, 0x0860, 0); - NV_WR32(par->PGRAPH, 0x0864, 0); - NV_WR32(par->PRAMDAC, 0x0608, - NV_RD32(par->PRAMDAC, - 0x0608) | 0x00100000); - break; - case 0x0140: - NV_WR32(par->PGRAPH, 0x0828, - 0x0072cb77); - NV_WR32(par->PGRAPH, 0x082C, - 0x00000108); - break; - case 0x0220: - NV_WR32(par->PGRAPH, 0x0860, 0); - NV_WR32(par->PGRAPH, 0x0864, 0); - NV_WR32(par->PRAMDAC, 0x0608, - NV_RD32(par->PRAMDAC, 0x0608) | - 0x00100000); - break; - case 0x0090: - case 0x0290: - case 0x0390: - NV_WR32(par->PRAMDAC, 0x0608, - NV_RD32(par->PRAMDAC, 0x0608) | - 0x00100000); - NV_WR32(par->PGRAPH, 0x0828, - 0x07830610); - NV_WR32(par->PGRAPH, 0x082C, - 0x0000016A); - break; - default: - break; - } - - NV_WR32(par->PGRAPH, 0x0b38, 0x2ffff800); - NV_WR32(par->PGRAPH, 0x0b3c, 0x00006000); - NV_WR32(par->PGRAPH, 0x032C, 0x01000000); - NV_WR32(par->PGRAPH, 0x0220, 0x00001200); - } else if (par->Architecture == NV_ARCH_30) { - NV_WR32(par->PGRAPH, 0x0084, 0x40108700); - NV_WR32(par->PGRAPH, 0x0890, 0x00140000); - NV_WR32(par->PGRAPH, 0x008C, 0xf00e0431); - NV_WR32(par->PGRAPH, 0x0090, 0x00008000); - NV_WR32(par->PGRAPH, 0x0610, 0xf04b1f36); - NV_WR32(par->PGRAPH, 0x0B80, 0x1002d888); - NV_WR32(par->PGRAPH, 0x0B88, 0x62ff007f); - } else { - NV_WR32(par->PGRAPH, 0x0084, 0x00118700); - NV_WR32(par->PGRAPH, 0x008C, 0xF20E0431); - NV_WR32(par->PGRAPH, 0x0090, 0x00000000); - NV_WR32(par->PGRAPH, 0x009C, 0x00000040); - - if ((par->Chipset & 0x0ff0) >= 0x0250) { - NV_WR32(par->PGRAPH, 0x0890, - 0x00080000); - NV_WR32(par->PGRAPH, 0x0610, - 0x304B1FB6); - NV_WR32(par->PGRAPH, 0x0B80, - 0x18B82880); - NV_WR32(par->PGRAPH, 0x0B84, - 0x44000000); - NV_WR32(par->PGRAPH, 0x0098, - 0x40000080); - NV_WR32(par->PGRAPH, 0x0B88, - 0x000000ff); - } else { - NV_WR32(par->PGRAPH, 0x0880, - 0x00080000); - NV_WR32(par->PGRAPH, 0x0094, - 0x00000005); - NV_WR32(par->PGRAPH, 0x0B80, - 0x45CAA208); - NV_WR32(par->PGRAPH, 0x0B84, - 0x24000000); - NV_WR32(par->PGRAPH, 0x0098, - 0x00000040); - NV_WR32(par->PGRAPH, 0x0750, - 0x00E00038); - NV_WR32(par->PGRAPH, 0x0754, - 0x00000030); - NV_WR32(par->PGRAPH, 0x0750, - 0x00E10038); - NV_WR32(par->PGRAPH, 0x0754, - 0x00000030); - } - } - - if ((par->Architecture < NV_ARCH_40) || - ((par->Chipset & 0xfff0) == 0x0040)) { - for (i = 0; i < 32; i++) { - NV_WR32(par->PGRAPH, 0x0900 + i*4, - NV_RD32(par->PFB, 0x0240 +i*4)); - NV_WR32(par->PGRAPH, 0x6900 + i*4, - NV_RD32(par->PFB, 0x0240 +i*4)); - } - } else { - if (((par->Chipset & 0xfff0) == 0x0090) || - ((par->Chipset & 0xfff0) == 0x01D0) || - ((par->Chipset & 0xfff0) == 0x0290) || - ((par->Chipset & 0xfff0) == 0x0390) || - ((par->Chipset & 0xfff0) == 0x03D0)) { - for (i = 0; i < 60; i++) { - NV_WR32(par->PGRAPH, - 0x0D00 + i*4, - NV_RD32(par->PFB, - 0x0600 + i*4)); - NV_WR32(par->PGRAPH, - 0x6900 + i*4, - NV_RD32(par->PFB, - 0x0600 + i*4)); - } - } else { - for (i = 0; i < 48; i++) { - NV_WR32(par->PGRAPH, - 0x0900 + i*4, - NV_RD32(par->PFB, - 0x0600 + i*4)); - if(((par->Chipset & 0xfff0) - != 0x0160) && - ((par->Chipset & 0xfff0) - != 0x0220) && - ((par->Chipset & 0xfff0) - != 0x240)) - NV_WR32(par->PGRAPH, - 0x6900 + i*4, - NV_RD32(par->PFB, - 0x0600 + i*4)); - } - } - } - - if (par->Architecture >= NV_ARCH_40) { - if ((par->Chipset & 0xfff0) == 0x0040) { - NV_WR32(par->PGRAPH, 0x09A4, - NV_RD32(par->PFB, 0x0200)); - NV_WR32(par->PGRAPH, 0x09A8, - NV_RD32(par->PFB, 0x0204)); - NV_WR32(par->PGRAPH, 0x69A4, - NV_RD32(par->PFB, 0x0200)); - NV_WR32(par->PGRAPH, 0x69A8, - NV_RD32(par->PFB, 0x0204)); - - NV_WR32(par->PGRAPH, 0x0820, 0); - NV_WR32(par->PGRAPH, 0x0824, 0); - NV_WR32(par->PGRAPH, 0x0864, - par->FbMapSize - 1); - NV_WR32(par->PGRAPH, 0x0868, - par->FbMapSize - 1); - } else { - if ((par->Chipset & 0xfff0) == 0x0090 || - (par->Chipset & 0xfff0) == 0x01D0 || - (par->Chipset & 0xfff0) == 0x0290 || - (par->Chipset & 0xfff0) == 0x0390) { - NV_WR32(par->PGRAPH, 0x0DF0, - NV_RD32(par->PFB, 0x0200)); - NV_WR32(par->PGRAPH, 0x0DF4, - NV_RD32(par->PFB, 0x0204)); - } else { - NV_WR32(par->PGRAPH, 0x09F0, - NV_RD32(par->PFB, 0x0200)); - NV_WR32(par->PGRAPH, 0x09F4, - NV_RD32(par->PFB, 0x0204)); - } - NV_WR32(par->PGRAPH, 0x69F0, - NV_RD32(par->PFB, 0x0200)); - NV_WR32(par->PGRAPH, 0x69F4, - NV_RD32(par->PFB, 0x0204)); - - NV_WR32(par->PGRAPH, 0x0840, 0); - NV_WR32(par->PGRAPH, 0x0844, 0); - NV_WR32(par->PGRAPH, 0x08a0, - par->FbMapSize - 1); - NV_WR32(par->PGRAPH, 0x08a4, - par->FbMapSize - 1); - } - } else { - NV_WR32(par->PGRAPH, 0x09A4, - NV_RD32(par->PFB, 0x0200)); - NV_WR32(par->PGRAPH, 0x09A8, - NV_RD32(par->PFB, 0x0204)); - NV_WR32(par->PGRAPH, 0x0750, 0x00EA0000); - NV_WR32(par->PGRAPH, 0x0754, - NV_RD32(par->PFB, 0x0200)); - NV_WR32(par->PGRAPH, 0x0750, 0x00EA0004); - NV_WR32(par->PGRAPH, 0x0754, - NV_RD32(par->PFB, 0x0204)); - - NV_WR32(par->PGRAPH, 0x0820, 0); - NV_WR32(par->PGRAPH, 0x0824, 0); - NV_WR32(par->PGRAPH, 0x0864, - par->FbMapSize - 1); - NV_WR32(par->PGRAPH, 0x0868, - par->FbMapSize - 1); - } - NV_WR32(par->PGRAPH, 0x0B20, 0x00000000); - NV_WR32(par->PGRAPH, 0x0B04, 0xFFFFFFFF); - } - } - NV_WR32(par->PGRAPH, 0x053C, 0); - NV_WR32(par->PGRAPH, 0x0540, 0); - NV_WR32(par->PGRAPH, 0x0544, 0x00007FFF); - NV_WR32(par->PGRAPH, 0x0548, 0x00007FFF); - - NV_WR32(par->PFIFO, 0x0140 * 4, 0x00000000); - NV_WR32(par->PFIFO, 0x0141 * 4, 0x00000001); - NV_WR32(par->PFIFO, 0x0480 * 4, 0x00000000); - NV_WR32(par->PFIFO, 0x0494 * 4, 0x00000000); - if (par->Architecture >= NV_ARCH_40) - NV_WR32(par->PFIFO, 0x0481 * 4, 0x00010000); - else - NV_WR32(par->PFIFO, 0x0481 * 4, 0x00000100); - NV_WR32(par->PFIFO, 0x0490 * 4, 0x00000000); - NV_WR32(par->PFIFO, 0x0491 * 4, 0x00000000); - if (par->Architecture >= NV_ARCH_40) - NV_WR32(par->PFIFO, 0x048B * 4, 0x00001213); - else - NV_WR32(par->PFIFO, 0x048B * 4, 0x00001209); - NV_WR32(par->PFIFO, 0x0400 * 4, 0x00000000); - NV_WR32(par->PFIFO, 0x0414 * 4, 0x00000000); - NV_WR32(par->PFIFO, 0x0084 * 4, 0x03000100); - NV_WR32(par->PFIFO, 0x0085 * 4, 0x00000110); - NV_WR32(par->PFIFO, 0x0086 * 4, 0x00000112); - NV_WR32(par->PFIFO, 0x0143 * 4, 0x0000FFFF); - NV_WR32(par->PFIFO, 0x0496 * 4, 0x0000FFFF); - NV_WR32(par->PFIFO, 0x0050 * 4, 0x00000000); - NV_WR32(par->PFIFO, 0x0040 * 4, 0xFFFFFFFF); - NV_WR32(par->PFIFO, 0x0415 * 4, 0x00000001); - NV_WR32(par->PFIFO, 0x048C * 4, 0x00000000); - NV_WR32(par->PFIFO, 0x04A0 * 4, 0x00000000); -#ifdef __BIG_ENDIAN - NV_WR32(par->PFIFO, 0x0489 * 4, 0x800F0078); -#else - NV_WR32(par->PFIFO, 0x0489 * 4, 0x000F0078); -#endif - NV_WR32(par->PFIFO, 0x0488 * 4, 0x00000001); - NV_WR32(par->PFIFO, 0x0480 * 4, 0x00000001); - NV_WR32(par->PFIFO, 0x0494 * 4, 0x00000001); - NV_WR32(par->PFIFO, 0x0495 * 4, 0x00000001); - NV_WR32(par->PFIFO, 0x0140 * 4, 0x00000001); - - if (!state) { - par->CurrentState = NULL; - return; - } - - if (par->Architecture >= NV_ARCH_10) { - if (par->twoHeads) { - NV_WR32(par->PCRTC0, 0x0860, state->head); - NV_WR32(par->PCRTC0, 0x2860, state->head2); - } - NV_WR32(par->PRAMDAC, 0x0404, NV_RD32(par->PRAMDAC, 0x0404) | - (1 << 25)); - - NV_WR32(par->PMC, 0x8704, 1); - NV_WR32(par->PMC, 0x8140, 0); - NV_WR32(par->PMC, 0x8920, 0); - NV_WR32(par->PMC, 0x8924, 0); - NV_WR32(par->PMC, 0x8908, par->FbMapSize - 1); - NV_WR32(par->PMC, 0x890C, par->FbMapSize - 1); - NV_WR32(par->PMC, 0x1588, 0); - - NV_WR32(par->PCRTC, 0x0810, state->cursorConfig); - NV_WR32(par->PCRTC, 0x0830, state->displayV - 3); - NV_WR32(par->PCRTC, 0x0834, state->displayV - 1); - - if (par->FlatPanel) { - if ((par->Chipset & 0x0ff0) == 0x0110) { - NV_WR32(par->PRAMDAC, 0x0528, state->dither); - } else if (par->twoHeads) { - NV_WR32(par->PRAMDAC, 0x083C, state->dither); - } - - VGA_WR08(par->PCIO, 0x03D4, 0x53); - VGA_WR08(par->PCIO, 0x03D5, state->timingH); - VGA_WR08(par->PCIO, 0x03D4, 0x54); - VGA_WR08(par->PCIO, 0x03D5, state->timingV); - VGA_WR08(par->PCIO, 0x03D4, 0x21); - VGA_WR08(par->PCIO, 0x03D5, 0xfa); - } - - VGA_WR08(par->PCIO, 0x03D4, 0x41); - VGA_WR08(par->PCIO, 0x03D5, state->extra); - } - - VGA_WR08(par->PCIO, 0x03D4, 0x19); - VGA_WR08(par->PCIO, 0x03D5, state->repaint0); - VGA_WR08(par->PCIO, 0x03D4, 0x1A); - VGA_WR08(par->PCIO, 0x03D5, state->repaint1); - VGA_WR08(par->PCIO, 0x03D4, 0x25); - VGA_WR08(par->PCIO, 0x03D5, state->screen); - VGA_WR08(par->PCIO, 0x03D4, 0x28); - VGA_WR08(par->PCIO, 0x03D5, state->pixel); - VGA_WR08(par->PCIO, 0x03D4, 0x2D); - VGA_WR08(par->PCIO, 0x03D5, state->horiz); - VGA_WR08(par->PCIO, 0x03D4, 0x1C); - VGA_WR08(par->PCIO, 0x03D5, state->fifo); - VGA_WR08(par->PCIO, 0x03D4, 0x1B); - VGA_WR08(par->PCIO, 0x03D5, state->arbitration0); - VGA_WR08(par->PCIO, 0x03D4, 0x20); - VGA_WR08(par->PCIO, 0x03D5, state->arbitration1); - - if(par->Architecture >= NV_ARCH_30) { - VGA_WR08(par->PCIO, 0x03D4, 0x47); - VGA_WR08(par->PCIO, 0x03D5, state->arbitration1 >> 8); - } - - VGA_WR08(par->PCIO, 0x03D4, 0x30); - VGA_WR08(par->PCIO, 0x03D5, state->cursor0); - VGA_WR08(par->PCIO, 0x03D4, 0x31); - VGA_WR08(par->PCIO, 0x03D5, state->cursor1); - VGA_WR08(par->PCIO, 0x03D4, 0x2F); - VGA_WR08(par->PCIO, 0x03D5, state->cursor2); - VGA_WR08(par->PCIO, 0x03D4, 0x39); - VGA_WR08(par->PCIO, 0x03D5, state->interlace); - - if (!par->FlatPanel) { - if (par->Architecture >= NV_ARCH_40) - NV_WR32(par->PRAMDAC0, 0x0580, state->control); - - NV_WR32(par->PRAMDAC0, 0x050C, state->pllsel); - NV_WR32(par->PRAMDAC0, 0x0508, state->vpll); - if (par->twoHeads) - NV_WR32(par->PRAMDAC0, 0x0520, state->vpll2); - if (par->twoStagePLL) { - NV_WR32(par->PRAMDAC0, 0x0578, state->vpllB); - NV_WR32(par->PRAMDAC0, 0x057C, state->vpll2B); - } - } else { - NV_WR32(par->PRAMDAC, 0x0848, state->scale); - NV_WR32(par->PRAMDAC, 0x0828, state->crtcSync + - par->PanelTweak); - } - - NV_WR32(par->PRAMDAC, 0x0600, state->general); - - NV_WR32(par->PCRTC, 0x0140, 0); - NV_WR32(par->PCRTC, 0x0100, 1); - - par->CurrentState = state; -} - -void NVUnloadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) { - VGA_WR08(par->PCIO, 0x03D4, 0x19); - state->repaint0 = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x1A); - state->repaint1 = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x25); - state->screen = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x28); - state->pixel = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x2D); - state->horiz = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x1C); - state->fifo = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x1B); - state->arbitration0 = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x20); - state->arbitration1 = VGA_RD08(par->PCIO, 0x03D5); - - if(par->Architecture >= NV_ARCH_30) { - VGA_WR08(par->PCIO, 0x03D4, 0x47); - state->arbitration1 |= (VGA_RD08(par->PCIO, 0x03D5) & 1) << 8; - } - - VGA_WR08(par->PCIO, 0x03D4, 0x30); - state->cursor0 = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x31); - state->cursor1 = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x2F); - state->cursor2 = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x39); - state->interlace = VGA_RD08(par->PCIO, 0x03D5); - state->vpll = NV_RD32(par->PRAMDAC0, 0x0508); - if (par->twoHeads) - state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520); - if (par->twoStagePLL) { - state->vpllB = NV_RD32(par->PRAMDAC0, 0x0578); - state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C); - } - state->pllsel = NV_RD32(par->PRAMDAC0, 0x050C); - state->general = NV_RD32(par->PRAMDAC, 0x0600); - state->scale = NV_RD32(par->PRAMDAC, 0x0848); - state->config = NV_RD32(par->PFB, 0x0200); - - if (par->Architecture >= NV_ARCH_40 && !par->FlatPanel) - state->control = NV_RD32(par->PRAMDAC0, 0x0580); - - if (par->Architecture >= NV_ARCH_10) { - if (par->twoHeads) { - state->head = NV_RD32(par->PCRTC0, 0x0860); - state->head2 = NV_RD32(par->PCRTC0, 0x2860); - VGA_WR08(par->PCIO, 0x03D4, 0x44); - state->crtcOwner = VGA_RD08(par->PCIO, 0x03D5); - } - VGA_WR08(par->PCIO, 0x03D4, 0x41); - state->extra = VGA_RD08(par->PCIO, 0x03D5); - state->cursorConfig = NV_RD32(par->PCRTC, 0x0810); - - if ((par->Chipset & 0x0ff0) == 0x0110) { - state->dither = NV_RD32(par->PRAMDAC, 0x0528); - } else if (par->twoHeads) { - state->dither = NV_RD32(par->PRAMDAC, 0x083C); - } - - if (par->FlatPanel) { - VGA_WR08(par->PCIO, 0x03D4, 0x53); - state->timingH = VGA_RD08(par->PCIO, 0x03D5); - VGA_WR08(par->PCIO, 0x03D4, 0x54); - state->timingV = VGA_RD08(par->PCIO, 0x03D5); - } - } -} - -void NVSetStartAddress(struct nvidia_par *par, u32 start) -{ - NV_WR32(par->PCRTC, 0x800, start); -} diff --git a/drivers/video/fbdev/nvidia/nv_i2c.c b/drivers/video/fbdev/nvidia/nv_i2c.c deleted file mode 100644 index d7994a173245..000000000000 --- a/drivers/video/fbdev/nvidia/nv_i2c.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * linux/drivers/video/nvidia/nvidia-i2c.c - nVidia i2c - * - * Copyright 2004 Antonino A. Daplas <adaplas @pol.net> - * - * Based on rivafb-i2c.c - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file COPYING in the main directory of this archive - * for more details. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/gfp.h> -#include <linux/pci.h> -#include <linux/fb.h> - -#include <asm/io.h> - -#include "nv_type.h" -#include "nv_local.h" -#include "nv_proto.h" - -#include "../edid.h" - -static void nvidia_gpio_setscl(void *data, int state) -{ - struct nvidia_i2c_chan *chan = data; - struct nvidia_par *par = chan->par; - u32 val; - - val = NVReadCrtc(par, chan->ddc_base + 1) & 0xf0; - - if (state) - val |= 0x20; - else - val &= ~0x20; - - NVWriteCrtc(par, chan->ddc_base + 1, val | 0x01); -} - -static void nvidia_gpio_setsda(void *data, int state) -{ - struct nvidia_i2c_chan *chan = data; - struct nvidia_par *par = chan->par; - u32 val; - - val = NVReadCrtc(par, chan->ddc_base + 1) & 0xf0; - - if (state) - val |= 0x10; - else - val &= ~0x10; - - NVWriteCrtc(par, chan->ddc_base + 1, val | 0x01); -} - -static int nvidia_gpio_getscl(void *data) -{ - struct nvidia_i2c_chan *chan = data; - struct nvidia_par *par = chan->par; - u32 val = 0; - - if (NVReadCrtc(par, chan->ddc_base) & 0x04) - val = 1; - - return val; -} - -static int nvidia_gpio_getsda(void *data) -{ - struct nvidia_i2c_chan *chan = data; - struct nvidia_par *par = chan->par; - u32 val = 0; - - if (NVReadCrtc(par, chan->ddc_base) & 0x08) - val = 1; - - return val; -} - -static int nvidia_setup_i2c_bus(struct nvidia_i2c_chan *chan, const char *name, - unsigned int i2c_class) -{ - int rc; - - strcpy(chan->adapter.name, name); - chan->adapter.owner = THIS_MODULE; - chan->adapter.class = i2c_class; - chan->adapter.algo_data = &chan->algo; - chan->adapter.dev.parent = &chan->par->pci_dev->dev; - chan->algo.setsda = nvidia_gpio_setsda; - chan->algo.setscl = nvidia_gpio_setscl; - chan->algo.getsda = nvidia_gpio_getsda; - chan->algo.getscl = nvidia_gpio_getscl; - chan->algo.udelay = 40; - chan->algo.timeout = msecs_to_jiffies(2); - chan->algo.data = chan; - - i2c_set_adapdata(&chan->adapter, chan); - - /* Raise SCL and SDA */ - nvidia_gpio_setsda(chan, 1); - nvidia_gpio_setscl(chan, 1); - udelay(20); - - rc = i2c_bit_add_bus(&chan->adapter); - if (rc == 0) - dev_dbg(&chan->par->pci_dev->dev, - "I2C bus %s registered.\n", name); - else { - dev_warn(&chan->par->pci_dev->dev, - "Failed to register I2C bus %s.\n", name); - chan->par = NULL; - } - - return rc; -} - -void nvidia_create_i2c_busses(struct nvidia_par *par) -{ - par->chan[0].par = par; - par->chan[1].par = par; - par->chan[2].par = par; - - par->chan[0].ddc_base = (par->reverse_i2c) ? 0x36 : 0x3e; - nvidia_setup_i2c_bus(&par->chan[0], "nvidia #0", - (par->reverse_i2c) ? I2C_CLASS_HWMON : 0); - - par->chan[1].ddc_base = (par->reverse_i2c) ? 0x3e : 0x36; - nvidia_setup_i2c_bus(&par->chan[1], "nvidia #1", - (par->reverse_i2c) ? 0 : I2C_CLASS_HWMON); - - par->chan[2].ddc_base = 0x50; - nvidia_setup_i2c_bus(&par->chan[2], "nvidia #2", 0); -} - -void nvidia_delete_i2c_busses(struct nvidia_par *par) -{ - int i; - - for (i = 0; i < 3; i++) { - if (!par->chan[i].par) - continue; - i2c_del_adapter(&par->chan[i].adapter); - par->chan[i].par = NULL; - } -} - -int nvidia_probe_i2c_connector(struct fb_info *info, int conn, u8 **out_edid) -{ - struct nvidia_par *par = info->par; - u8 *edid = NULL; - - if (par->chan[conn - 1].par) - edid = fb_ddc_read(&par->chan[conn - 1].adapter); - - if (!edid && conn == 1) { - /* try to get from firmware */ - const u8 *e = fb_firmware_edid(info->device); - - if (e != NULL) - edid = kmemdup(e, EDID_LENGTH, GFP_KERNEL); - } - - *out_edid = edid; - - return (edid) ? 0 : 1; -} diff --git a/drivers/video/fbdev/nvidia/nv_local.h b/drivers/video/fbdev/nvidia/nv_local.h deleted file mode 100644 index 68e508daa417..000000000000 --- a/drivers/video/fbdev/nvidia/nv_local.h +++ /dev/null @@ -1,114 +0,0 @@ -/***************************************************************************\ -|* *| -|* Copyright 1993-2003 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NOTICE TO USER: The source code is copyrighted under U.S. and *| -|* international laws. Users and possessors of this source code are *| -|* hereby granted a nonexclusive, royalty-free copyright license to *| -|* use this code in individual and commercial software. *| -|* *| -|* Any use of this source code must include, in the user documenta- *| -|* tion and internal comments to the code, notices to the end user *| -|* as follows: *| -|* *| -|* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *| -|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *| -|* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *| -|* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *| -|* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *| -|* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *| -|* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *| -|* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *| -|* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *| -|* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *| -|* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *| -|* *| -|* U.S. Government End Users. This source code is a "commercial *| -|* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *| -|* consisting of "commercial computer software" and "commercial *| -|* computer software documentation," as such terms are used in *| -|* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *| -|* ment only as a commercial end item. Consistent with 48 C.F.R. *| -|* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *| -|* all U.S. Government End Users acquire the source code with only *| -|* those rights set forth herein. *| -|* *| - \***************************************************************************/ - -/* - * GPL Licensing Note - According to Mark Vojkovich, author of the Xorg/ - * XFree86 'nv' driver, this source code is provided under MIT-style licensing - * where the source code is provided "as is" without warranty of any kind. - * The only usage restriction is for the copyright notices to be retained - * whenever code is used. - * - * Antonino Daplas <adaplas@pol.net> 2005-03-11 - */ - -#ifndef __NV_LOCAL_H__ -#define __NV_LOCAL_H__ - -/* - * This file includes any environment or machine specific values to access the - * HW. Put all affected includes, typdefs, etc. here so the riva_hw.* files - * can stay generic in nature. - */ - -/* - * HW access macros. These assume memory-mapped I/O, and not normal I/O space. - */ -#define NV_WR08(p,i,d) (__raw_writeb((d), (void __iomem *)(p) + (i))) -#define NV_RD08(p,i) (__raw_readb((void __iomem *)(p) + (i))) -#define NV_WR16(p,i,d) (__raw_writew((d), (void __iomem *)(p) + (i))) -#define NV_RD16(p,i) (__raw_readw((void __iomem *)(p) + (i))) -#define NV_WR32(p,i,d) (__raw_writel((d), (void __iomem *)(p) + (i))) -#define NV_RD32(p,i) (__raw_readl((void __iomem *)(p) + (i))) - -/* VGA I/O is now always done through MMIO */ -#define VGA_WR08(p,i,d) (writeb((d), (void __iomem *)(p) + (i))) -#define VGA_RD08(p,i) (readb((void __iomem *)(p) + (i))) - -#define NVDmaNext(par, data) \ - NV_WR32(&(par)->dmaBase[(par)->dmaCurrent++], 0, (data)) - -#define NVDmaStart(info, par, tag, size) { \ - if((par)->dmaFree <= (size)) \ - NVDmaWait(info, size); \ - NVDmaNext(par, ((size) << 18) | (tag)); \ - (par)->dmaFree -= ((size) + 1); \ -} - -#if defined(__i386__) -#define _NV_FENCE() outb(0, 0x3D0); -#else -#define _NV_FENCE() mb(); -#endif - -#define WRITE_PUT(par, data) { \ - _NV_FENCE() \ - NV_RD08((par)->FbStart, 0); \ - NV_WR32(&(par)->FIFO[0x0010], 0, (data) << 2); \ - mb(); \ -} - -#define READ_GET(par) (NV_RD32(&(par)->FIFO[0x0011], 0) >> 2) - -#ifdef __LITTLE_ENDIAN - -#include <linux/bitrev.h> - -#define reverse_order(l) \ -do { \ - u8 *a = (u8 *)(l); \ - a[0] = bitrev8(a[0]); \ - a[1] = bitrev8(a[1]); \ - a[2] = bitrev8(a[2]); \ - a[3] = bitrev8(a[3]); \ -} while(0) -#else -#define reverse_order(l) do { } while(0) -#endif /* __LITTLE_ENDIAN */ - -#endif /* __NV_LOCAL_H__ */ diff --git a/drivers/video/fbdev/nvidia/nv_of.c b/drivers/video/fbdev/nvidia/nv_of.c deleted file mode 100644 index 5f3e5179c25a..000000000000 --- a/drivers/video/fbdev/nvidia/nv_of.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * linux/drivers/video/nvidia/nv_of.c - * - * Copyright 2004 Antonino A. Daplas <adaplas @pol.net> - * - * Based on rivafb-i2c.c - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file COPYING in the main directory of this archive - * for more details. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/gfp.h> -#include <linux/pci.h> -#include <linux/fb.h> - -#include <asm/io.h> - -#include "nv_type.h" -#include "nv_local.h" -#include "nv_proto.h" - -#include "../edid.h" - -int nvidia_probe_of_connector(struct fb_info *info, int conn, u8 **out_edid) -{ - struct nvidia_par *par = info->par; - struct device_node *parent, *dp; - const unsigned char *pedid = NULL; - static char *propnames[] = { - "DFP,EDID", "LCD,EDID", "EDID", "EDID1", - "EDID,B", "EDID,A", NULL }; - int i; - - parent = pci_device_to_OF_node(par->pci_dev); - if (parent == NULL) - return -1; - if (par->twoHeads) { - const char *pname; - int len; - - for (dp = NULL; - (dp = of_get_next_child(parent, dp)) != NULL;) { - pname = of_get_property(dp, "name", NULL); - if (!pname) - continue; - len = strlen(pname); - if ((pname[len-1] == 'A' && conn == 1) || - (pname[len-1] == 'B' && conn == 2)) { - for (i = 0; propnames[i] != NULL; ++i) { - pedid = of_get_property(dp, - propnames[i], NULL); - if (pedid != NULL) - break; - } - of_node_put(dp); - break; - } - } - } - if (pedid == NULL) { - for (i = 0; propnames[i] != NULL; ++i) { - pedid = of_get_property(parent, propnames[i], NULL); - if (pedid != NULL) - break; - } - } - if (pedid) { - *out_edid = kmemdup(pedid, EDID_LENGTH, GFP_KERNEL); - if (*out_edid == NULL) - return -1; - printk(KERN_DEBUG "nvidiafb: Found OF EDID for head %d\n", conn); - return 0; - } - return -1; -} diff --git a/drivers/video/fbdev/nvidia/nv_proto.h b/drivers/video/fbdev/nvidia/nv_proto.h deleted file mode 100644 index fb9c5ebf2958..000000000000 --- a/drivers/video/fbdev/nvidia/nv_proto.h +++ /dev/null @@ -1,68 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_proto.h,v 1.10 2003/07/31 20:24:29 mvojkovi Exp $ */ - -#ifndef __NV_PROTO_H__ -#define __NV_PROTO_H__ - -/* in nv_setup.c */ -int NVCommonSetup(struct fb_info *info); -void NVWriteCrtc(struct nvidia_par *par, u8 index, u8 value); -u8 NVReadCrtc(struct nvidia_par *par, u8 index); -void NVWriteGr(struct nvidia_par *par, u8 index, u8 value); -u8 NVReadGr(struct nvidia_par *par, u8 index); -void NVWriteSeq(struct nvidia_par *par, u8 index, u8 value); -u8 NVReadSeq(struct nvidia_par *par, u8 index); -void NVWriteAttr(struct nvidia_par *par, u8 index, u8 value); -u8 NVReadAttr(struct nvidia_par *par, u8 index); -void NVWriteMiscOut(struct nvidia_par *par, u8 value); -u8 NVReadMiscOut(struct nvidia_par *par); -void NVWriteDacMask(struct nvidia_par *par, u8 value); -void NVWriteDacReadAddr(struct nvidia_par *par, u8 value); -void NVWriteDacWriteAddr(struct nvidia_par *par, u8 value); -void NVWriteDacData(struct nvidia_par *par, u8 value); -u8 NVReadDacData(struct nvidia_par *par); - -/* in nv_hw.c */ -void NVCalcStateExt(struct nvidia_par *par, struct _riva_hw_state *, - int, int, int, int, int, int); -void NVLoadStateExt(struct nvidia_par *par, struct _riva_hw_state *); -void NVUnloadStateExt(struct nvidia_par *par, struct _riva_hw_state *); -void NVSetStartAddress(struct nvidia_par *par, u32); -int NVShowHideCursor(struct nvidia_par *par, int); -void NVLockUnlock(struct nvidia_par *par, int); - -/* in nvidia-i2c.c */ -#ifdef CONFIG_FB_NVIDIA_I2C -void nvidia_create_i2c_busses(struct nvidia_par *par); -void nvidia_delete_i2c_busses(struct nvidia_par *par); -int nvidia_probe_i2c_connector(struct fb_info *info, int conn, - u8 ** out_edid); -#else -#define nvidia_create_i2c_busses(...) -#define nvidia_delete_i2c_busses(...) -#define nvidia_probe_i2c_connector(p, c, edid) (-1) -#endif - -int nvidia_probe_of_connector(struct fb_info *info, int conn, - u8 ** out_edid); - -/* in nv_accel.c */ -extern void NVResetGraphics(struct fb_info *info); -extern void nvidiafb_copyarea(struct fb_info *info, - const struct fb_copyarea *region); -extern void nvidiafb_fillrect(struct fb_info *info, - const struct fb_fillrect *rect); -extern void nvidiafb_imageblit(struct fb_info *info, - const struct fb_image *image); -extern int nvidiafb_sync(struct fb_info *info); - -/* in nv_backlight.h */ -#ifdef CONFIG_FB_NVIDIA_BACKLIGHT -extern void nvidia_bl_init(struct nvidia_par *par); -extern void nvidia_bl_exit(struct nvidia_par *par); -#else -static inline void nvidia_bl_init(struct nvidia_par *par) {} -static inline void nvidia_bl_exit(struct nvidia_par *par) {} -#endif - -#endif /* __NV_PROTO_H__ */ diff --git a/drivers/video/fbdev/nvidia/nv_setup.c b/drivers/video/fbdev/nvidia/nv_setup.c deleted file mode 100644 index 2fa68669613a..000000000000 --- a/drivers/video/fbdev/nvidia/nv_setup.c +++ /dev/null @@ -1,652 +0,0 @@ - /***************************************************************************\ -|* *| -|* Copyright 2003 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NOTICE TO USER: The source code is copyrighted under U.S. and *| -|* international laws. Users and possessors of this source code are *| -|* hereby granted a nonexclusive, royalty-free copyright license to *| -|* use this code in individual and commercial software. *| -|* *| -|* Any use of this source code must include, in the user documenta- *| -|* tion and internal comments to the code, notices to the end user *| -|* as follows: *| -|* *| -|* Copyright 2003 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *| -|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *| -|* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *| -|* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *| -|* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *| -|* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *| -|* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *| -|* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *| -|* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *| -|* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *| -|* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *| -|* *| -|* U.S. Government End Users. This source code is a "commercial *| -|* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *| -|* consisting of "commercial computer software" and "commercial *| -|* computer software documentation," as such terms are used in *| -|* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *| -|* ment only as a commercial end item. Consistent with 48 C.F.R. *| -|* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *| -|* all U.S. Government End Users acquire the source code with only *| -|* those rights set forth herein. *| -|* *| - \***************************************************************************/ - -/* - * GPL Licensing Note - According to Mark Vojkovich, author of the Xorg/ - * XFree86 'nv' driver, this source code is provided under MIT-style licensing - * where the source code is provided "as is" without warranty of any kind. - * The only usage restriction is for the copyright notices to be retained - * whenever code is used. - * - * Antonino Daplas <adaplas@pol.net> 2005-03-11 - */ - -#include <video/vga.h> -#include <linux/delay.h> -#include <linux/pci.h> -#include <linux/slab.h> -#include "nv_type.h" -#include "nv_local.h" -#include "nv_proto.h" -/* - * Override VGA I/O routines. - */ -void NVWriteCrtc(struct nvidia_par *par, u8 index, u8 value) -{ - VGA_WR08(par->PCIO, par->IOBase + 0x04, index); - VGA_WR08(par->PCIO, par->IOBase + 0x05, value); -} -u8 NVReadCrtc(struct nvidia_par *par, u8 index) -{ - VGA_WR08(par->PCIO, par->IOBase + 0x04, index); - return (VGA_RD08(par->PCIO, par->IOBase + 0x05)); -} -void NVWriteGr(struct nvidia_par *par, u8 index, u8 value) -{ - VGA_WR08(par->PVIO, VGA_GFX_I, index); - VGA_WR08(par->PVIO, VGA_GFX_D, value); -} -u8 NVReadGr(struct nvidia_par *par, u8 index) -{ - VGA_WR08(par->PVIO, VGA_GFX_I, index); - return (VGA_RD08(par->PVIO, VGA_GFX_D)); -} -void NVWriteSeq(struct nvidia_par *par, u8 index, u8 value) -{ - VGA_WR08(par->PVIO, VGA_SEQ_I, index); - VGA_WR08(par->PVIO, VGA_SEQ_D, value); -} -u8 NVReadSeq(struct nvidia_par *par, u8 index) -{ - VGA_WR08(par->PVIO, VGA_SEQ_I, index); - return (VGA_RD08(par->PVIO, VGA_SEQ_D)); -} -void NVWriteAttr(struct nvidia_par *par, u8 index, u8 value) -{ - volatile u8 tmp; - - tmp = VGA_RD08(par->PCIO, par->IOBase + 0x0a); - if (par->paletteEnabled) - index &= ~0x20; - else - index |= 0x20; - VGA_WR08(par->PCIO, VGA_ATT_IW, index); - VGA_WR08(par->PCIO, VGA_ATT_W, value); -} -u8 NVReadAttr(struct nvidia_par *par, u8 index) -{ - volatile u8 tmp; - - tmp = VGA_RD08(par->PCIO, par->IOBase + 0x0a); - if (par->paletteEnabled) - index &= ~0x20; - else - index |= 0x20; - VGA_WR08(par->PCIO, VGA_ATT_IW, index); - return (VGA_RD08(par->PCIO, VGA_ATT_R)); -} -void NVWriteMiscOut(struct nvidia_par *par, u8 value) -{ - VGA_WR08(par->PVIO, VGA_MIS_W, value); -} -u8 NVReadMiscOut(struct nvidia_par *par) -{ - return (VGA_RD08(par->PVIO, VGA_MIS_R)); -} -void NVWriteDacMask(struct nvidia_par *par, u8 value) -{ - VGA_WR08(par->PDIO, VGA_PEL_MSK, value); -} -void NVWriteDacReadAddr(struct nvidia_par *par, u8 value) -{ - VGA_WR08(par->PDIO, VGA_PEL_IR, value); -} -void NVWriteDacWriteAddr(struct nvidia_par *par, u8 value) -{ - VGA_WR08(par->PDIO, VGA_PEL_IW, value); -} -void NVWriteDacData(struct nvidia_par *par, u8 value) -{ - VGA_WR08(par->PDIO, VGA_PEL_D, value); -} -u8 NVReadDacData(struct nvidia_par *par) -{ - return (VGA_RD08(par->PDIO, VGA_PEL_D)); -} - -static int NVIsConnected(struct nvidia_par *par, int output) -{ - volatile u32 __iomem *PRAMDAC = par->PRAMDAC0; - u32 reg52C, reg608, dac0_reg608 = 0; - int present; - - if (output) { - dac0_reg608 = NV_RD32(PRAMDAC, 0x0608); - PRAMDAC += 0x800; - } - - reg52C = NV_RD32(PRAMDAC, 0x052C); - reg608 = NV_RD32(PRAMDAC, 0x0608); - - NV_WR32(PRAMDAC, 0x0608, reg608 & ~0x00010000); - - NV_WR32(PRAMDAC, 0x052C, reg52C & 0x0000FEEE); - msleep(1); - NV_WR32(PRAMDAC, 0x052C, NV_RD32(PRAMDAC, 0x052C) | 1); - - NV_WR32(par->PRAMDAC0, 0x0610, 0x94050140); - NV_WR32(par->PRAMDAC0, 0x0608, NV_RD32(par->PRAMDAC0, 0x0608) | - 0x00001000); - - msleep(1); - - present = (NV_RD32(PRAMDAC, 0x0608) & (1 << 28)) ? 1 : 0; - - if (present) - printk("nvidiafb: CRTC%i analog found\n", output); - else - printk("nvidiafb: CRTC%i analog not found\n", output); - - if (output) - NV_WR32(par->PRAMDAC0, 0x0608, dac0_reg608); - - NV_WR32(PRAMDAC, 0x052C, reg52C); - NV_WR32(PRAMDAC, 0x0608, reg608); - - return present; -} - -static void NVSelectHeadRegisters(struct nvidia_par *par, int head) -{ - if (head) { - par->PCIO = par->PCIO0 + 0x2000; - par->PCRTC = par->PCRTC0 + 0x800; - par->PRAMDAC = par->PRAMDAC0 + 0x800; - par->PDIO = par->PDIO0 + 0x2000; - } else { - par->PCIO = par->PCIO0; - par->PCRTC = par->PCRTC0; - par->PRAMDAC = par->PRAMDAC0; - par->PDIO = par->PDIO0; - } -} - -static void nv4GetConfig(struct nvidia_par *par) -{ - if (NV_RD32(par->PFB, 0x0000) & 0x00000100) { - par->RamAmountKBytes = - ((NV_RD32(par->PFB, 0x0000) >> 12) & 0x0F) * 1024 * 2 + - 1024 * 2; - } else { - switch (NV_RD32(par->PFB, 0x0000) & 0x00000003) { - case 0: - par->RamAmountKBytes = 1024 * 32; - break; - case 1: - par->RamAmountKBytes = 1024 * 4; - break; - case 2: - par->RamAmountKBytes = 1024 * 8; - break; - case 3: - default: - par->RamAmountKBytes = 1024 * 16; - break; - } - } - par->CrystalFreqKHz = (NV_RD32(par->PEXTDEV, 0x0000) & 0x00000040) ? - 14318 : 13500; - par->CURSOR = &par->PRAMIN[0x1E00]; - par->MinVClockFreqKHz = 12000; - par->MaxVClockFreqKHz = 350000; -} - -static void nv10GetConfig(struct nvidia_par *par) -{ - struct pci_dev *dev; - u32 implementation = par->Chipset & 0x0ff0; - -#ifdef __BIG_ENDIAN - /* turn on big endian register access */ - if (!(NV_RD32(par->PMC, 0x0004) & 0x01000001)) { - NV_WR32(par->PMC, 0x0004, 0x01000001); - mb(); - } -#endif - - dev = pci_get_domain_bus_and_slot(pci_domain_nr(par->pci_dev->bus), - 0, 1); - if ((par->Chipset & 0xffff) == 0x01a0) { - u32 amt; - - pci_read_config_dword(dev, 0x7c, &amt); - par->RamAmountKBytes = (((amt >> 6) & 31) + 1) * 1024; - } else if ((par->Chipset & 0xffff) == 0x01f0) { - u32 amt; - - pci_read_config_dword(dev, 0x84, &amt); - par->RamAmountKBytes = (((amt >> 4) & 127) + 1) * 1024; - } else { - par->RamAmountKBytes = - (NV_RD32(par->PFB, 0x020C) & 0xFFF00000) >> 10; - } - pci_dev_put(dev); - - par->CrystalFreqKHz = (NV_RD32(par->PEXTDEV, 0x0000) & (1 << 6)) ? - 14318 : 13500; - - if (par->twoHeads && (implementation != 0x0110)) { - if (NV_RD32(par->PEXTDEV, 0x0000) & (1 << 22)) - par->CrystalFreqKHz = 27000; - } - - par->CURSOR = NULL; /* can't set this here */ - par->MinVClockFreqKHz = 12000; - par->MaxVClockFreqKHz = par->twoStagePLL ? 400000 : 350000; -} - -int NVCommonSetup(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - struct fb_var_screeninfo *var; - u16 implementation = par->Chipset & 0x0ff0; - u8 *edidA = NULL, *edidB = NULL; - struct fb_monspecs *monitorA, *monitorB; - struct fb_monspecs *monA = NULL, *monB = NULL; - int mobile = 0; - int tvA = 0; - int tvB = 0; - int FlatPanel = -1; /* really means the CRTC is slaved */ - int Television = 0; - int err = 0; - - var = kzalloc(sizeof(struct fb_var_screeninfo), GFP_KERNEL); - monitorA = kzalloc(sizeof(struct fb_monspecs), GFP_KERNEL); - monitorB = kzalloc(sizeof(struct fb_monspecs), GFP_KERNEL); - - if (!var || !monitorA || !monitorB) { - err = -ENOMEM; - goto done; - } - - par->PRAMIN = par->REGS + (0x00710000 / 4); - par->PCRTC0 = par->REGS + (0x00600000 / 4); - par->PRAMDAC0 = par->REGS + (0x00680000 / 4); - par->PFB = par->REGS + (0x00100000 / 4); - par->PFIFO = par->REGS + (0x00002000 / 4); - par->PGRAPH = par->REGS + (0x00400000 / 4); - par->PEXTDEV = par->REGS + (0x00101000 / 4); - par->PTIMER = par->REGS + (0x00009000 / 4); - par->PMC = par->REGS + (0x00000000 / 4); - par->FIFO = par->REGS + (0x00800000 / 4); - - /* 8 bit registers */ - par->PCIO0 = (u8 __iomem *) par->REGS + 0x00601000; - par->PDIO0 = (u8 __iomem *) par->REGS + 0x00681000; - par->PVIO = (u8 __iomem *) par->REGS + 0x000C0000; - - par->twoHeads = (par->Architecture >= NV_ARCH_10) && - (implementation != 0x0100) && - (implementation != 0x0150) && - (implementation != 0x01A0) && (implementation != 0x0200); - - par->fpScaler = (par->FpScale && par->twoHeads && - (implementation != 0x0110)); - - par->twoStagePLL = (implementation == 0x0310) || - (implementation == 0x0340) || (par->Architecture >= NV_ARCH_40); - - par->WaitVSyncPossible = (par->Architecture >= NV_ARCH_10) && - (implementation != 0x0100); - - par->BlendingPossible = ((par->Chipset & 0xffff) != 0x0020); - - /* look for known laptop chips */ - switch (par->Chipset & 0xffff) { - case 0x0112: - case 0x0174: - case 0x0175: - case 0x0176: - case 0x0177: - case 0x0179: - case 0x017C: - case 0x017D: - case 0x0186: - case 0x0187: - case 0x018D: - case 0x01D7: - case 0x0228: - case 0x0286: - case 0x028C: - case 0x0316: - case 0x0317: - case 0x031A: - case 0x031B: - case 0x031C: - case 0x031D: - case 0x031E: - case 0x031F: - case 0x0324: - case 0x0325: - case 0x0328: - case 0x0329: - case 0x032C: - case 0x032D: - case 0x0347: - case 0x0348: - case 0x0349: - case 0x034B: - case 0x034C: - case 0x0160: - case 0x0166: - case 0x0169: - case 0x016B: - case 0x016C: - case 0x016D: - case 0x00C8: - case 0x00CC: - case 0x0144: - case 0x0146: - case 0x0147: - case 0x0148: - case 0x0098: - case 0x0099: - mobile = 1; - break; - default: - break; - } - - if (par->Architecture == NV_ARCH_04) - nv4GetConfig(par); - else - nv10GetConfig(par); - - NVSelectHeadRegisters(par, 0); - - NVLockUnlock(par, 0); - - par->IOBase = (NVReadMiscOut(par) & 0x01) ? 0x3d0 : 0x3b0; - - par->Television = 0; - - nvidia_create_i2c_busses(par); - if (!par->twoHeads) { - par->CRTCnumber = 0; - if (nvidia_probe_i2c_connector(info, 1, &edidA)) - nvidia_probe_of_connector(info, 1, &edidA); - if (edidA && !fb_parse_edid(edidA, var)) { - printk("nvidiafb: EDID found from BUS1\n"); - monA = monitorA; - fb_edid_to_monspecs(edidA, monA); - FlatPanel = (monA->input & FB_DISP_DDI) ? 1 : 0; - - /* NV4 doesn't support FlatPanels */ - if ((par->Chipset & 0x0fff) <= 0x0020) - FlatPanel = 0; - } else { - VGA_WR08(par->PCIO, 0x03D4, 0x28); - if (VGA_RD08(par->PCIO, 0x03D5) & 0x80) { - VGA_WR08(par->PCIO, 0x03D4, 0x33); - if (!(VGA_RD08(par->PCIO, 0x03D5) & 0x01)) - Television = 1; - FlatPanel = 1; - } else { - FlatPanel = 0; - } - printk("nvidiafb: HW is currently programmed for %s\n", - FlatPanel ? (Television ? "TV" : "DFP") : - "CRT"); - } - - if (par->FlatPanel == -1) { - par->FlatPanel = FlatPanel; - par->Television = Television; - } else { - printk("nvidiafb: Forcing display type to %s as " - "specified\n", par->FlatPanel ? "DFP" : "CRT"); - } - } else { - u8 outputAfromCRTC, outputBfromCRTC; - int CRTCnumber = -1; - u8 slaved_on_A, slaved_on_B; - int analog_on_A, analog_on_B; - u32 oldhead; - u8 cr44; - - if (implementation != 0x0110) { - if (NV_RD32(par->PRAMDAC0, 0x0000052C) & 0x100) - outputAfromCRTC = 1; - else - outputAfromCRTC = 0; - if (NV_RD32(par->PRAMDAC0, 0x0000252C) & 0x100) - outputBfromCRTC = 1; - else - outputBfromCRTC = 0; - analog_on_A = NVIsConnected(par, 0); - analog_on_B = NVIsConnected(par, 1); - } else { - outputAfromCRTC = 0; - outputBfromCRTC = 1; - analog_on_A = 0; - analog_on_B = 0; - } - - VGA_WR08(par->PCIO, 0x03D4, 0x44); - cr44 = VGA_RD08(par->PCIO, 0x03D5); - - VGA_WR08(par->PCIO, 0x03D5, 3); - NVSelectHeadRegisters(par, 1); - NVLockUnlock(par, 0); - - VGA_WR08(par->PCIO, 0x03D4, 0x28); - slaved_on_B = VGA_RD08(par->PCIO, 0x03D5) & 0x80; - if (slaved_on_B) { - VGA_WR08(par->PCIO, 0x03D4, 0x33); - tvB = !(VGA_RD08(par->PCIO, 0x03D5) & 0x01); - } - - VGA_WR08(par->PCIO, 0x03D4, 0x44); - VGA_WR08(par->PCIO, 0x03D5, 0); - NVSelectHeadRegisters(par, 0); - NVLockUnlock(par, 0); - - VGA_WR08(par->PCIO, 0x03D4, 0x28); - slaved_on_A = VGA_RD08(par->PCIO, 0x03D5) & 0x80; - if (slaved_on_A) { - VGA_WR08(par->PCIO, 0x03D4, 0x33); - tvA = !(VGA_RD08(par->PCIO, 0x03D5) & 0x01); - } - - oldhead = NV_RD32(par->PCRTC0, 0x00000860); - NV_WR32(par->PCRTC0, 0x00000860, oldhead | 0x00000010); - - if (nvidia_probe_i2c_connector(info, 1, &edidA)) - nvidia_probe_of_connector(info, 1, &edidA); - if (edidA && !fb_parse_edid(edidA, var)) { - printk("nvidiafb: EDID found from BUS1\n"); - monA = monitorA; - fb_edid_to_monspecs(edidA, monA); - } - - if (nvidia_probe_i2c_connector(info, 2, &edidB)) - nvidia_probe_of_connector(info, 2, &edidB); - if (edidB && !fb_parse_edid(edidB, var)) { - printk("nvidiafb: EDID found from BUS2\n"); - monB = monitorB; - fb_edid_to_monspecs(edidB, monB); - } - - if (slaved_on_A && !tvA) { - CRTCnumber = 0; - FlatPanel = 1; - printk("nvidiafb: CRTC 0 is currently programmed for " - "DFP\n"); - } else if (slaved_on_B && !tvB) { - CRTCnumber = 1; - FlatPanel = 1; - printk("nvidiafb: CRTC 1 is currently programmed " - "for DFP\n"); - } else if (analog_on_A) { - CRTCnumber = outputAfromCRTC; - FlatPanel = 0; - printk("nvidiafb: CRTC %i appears to have a " - "CRT attached\n", CRTCnumber); - } else if (analog_on_B) { - CRTCnumber = outputBfromCRTC; - FlatPanel = 0; - printk("nvidiafb: CRTC %i appears to have a " - "CRT attached\n", CRTCnumber); - } else if (slaved_on_A) { - CRTCnumber = 0; - FlatPanel = 1; - Television = 1; - printk("nvidiafb: CRTC 0 is currently programmed " - "for TV\n"); - } else if (slaved_on_B) { - CRTCnumber = 1; - FlatPanel = 1; - Television = 1; - printk("nvidiafb: CRTC 1 is currently programmed for " - "TV\n"); - } else if (monA) { - FlatPanel = (monA->input & FB_DISP_DDI) ? 1 : 0; - } else if (monB) { - FlatPanel = (monB->input & FB_DISP_DDI) ? 1 : 0; - } - - if (par->FlatPanel == -1) { - if (FlatPanel != -1) { - par->FlatPanel = FlatPanel; - par->Television = Television; - } else { - printk("nvidiafb: Unable to detect display " - "type...\n"); - if (mobile) { - printk("...On a laptop, assuming " - "DFP\n"); - par->FlatPanel = 1; - } else { - printk("...Using default of CRT\n"); - par->FlatPanel = 0; - } - } - } else { - printk("nvidiafb: Forcing display type to %s as " - "specified\n", par->FlatPanel ? "DFP" : "CRT"); - } - - if (par->CRTCnumber == -1) { - if (CRTCnumber != -1) - par->CRTCnumber = CRTCnumber; - else { - printk("nvidiafb: Unable to detect which " - "CRTCNumber...\n"); - if (par->FlatPanel) - par->CRTCnumber = 1; - else - par->CRTCnumber = 0; - printk("...Defaulting to CRTCNumber %i\n", - par->CRTCnumber); - } - } else { - printk("nvidiafb: Forcing CRTCNumber %i as " - "specified\n", par->CRTCnumber); - } - - if (monA) { - if (((monA->input & FB_DISP_DDI) && - par->FlatPanel) || - ((!(monA->input & FB_DISP_DDI)) && - !par->FlatPanel)) { - if (monB) { - fb_destroy_modedb(monB->modedb); - monB = NULL; - } - } else { - fb_destroy_modedb(monA->modedb); - monA = NULL; - } - } - - if (monB) { - if (((monB->input & FB_DISP_DDI) && - !par->FlatPanel) || - ((!(monB->input & FB_DISP_DDI)) && - par->FlatPanel)) { - fb_destroy_modedb(monB->modedb); - monB = NULL; - } else - monA = monB; - } - - if (implementation == 0x0110) - cr44 = par->CRTCnumber * 0x3; - - NV_WR32(par->PCRTC0, 0x00000860, oldhead); - - VGA_WR08(par->PCIO, 0x03D4, 0x44); - VGA_WR08(par->PCIO, 0x03D5, cr44); - NVSelectHeadRegisters(par, par->CRTCnumber); - } - - printk("nvidiafb: Using %s on CRTC %i\n", - par->FlatPanel ? (par->Television ? "TV" : "DFP") : "CRT", - par->CRTCnumber); - - if (par->FlatPanel && !par->Television) { - par->fpWidth = NV_RD32(par->PRAMDAC, 0x0820) + 1; - par->fpHeight = NV_RD32(par->PRAMDAC, 0x0800) + 1; - par->fpSyncs = NV_RD32(par->PRAMDAC, 0x0848) & 0x30000033; - - printk("nvidiafb: Panel size is %i x %i\n", par->fpWidth, par->fpHeight); - } - - if (monA) - info->monspecs = *monA; - - if (!par->FlatPanel || !par->twoHeads) - par->FPDither = 0; - - par->LVDS = 0; - if (par->FlatPanel && par->twoHeads) { - NV_WR32(par->PRAMDAC0, 0x08B0, 0x00010004); - if (NV_RD32(par->PRAMDAC0, 0x08b4) & 1) - par->LVDS = 1; - printk("nvidiafb: Panel is %s\n", par->LVDS ? "LVDS" : "TMDS"); - } - - kfree(edidA); - kfree(edidB); -done: - kfree(var); - kfree(monitorA); - kfree(monitorB); - return err; -} diff --git a/drivers/video/fbdev/nvidia/nv_type.h b/drivers/video/fbdev/nvidia/nv_type.h deleted file mode 100644 index d7a1d4363d5f..000000000000 --- a/drivers/video/fbdev/nvidia/nv_type.h +++ /dev/null @@ -1,176 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __NV_TYPE_H__ -#define __NV_TYPE_H__ - -#include <linux/fb.h> -#include <linux/types.h> -#include <linux/i2c.h> -#include <linux/i2c-algo-bit.h> -#include <video/vga.h> - -#define NV_ARCH_04 0x04 -#define NV_ARCH_10 0x10 -#define NV_ARCH_20 0x20 -#define NV_ARCH_30 0x30 -#define NV_ARCH_40 0x40 - -#define BITMASK(t,b) (((unsigned)(1U << (((t)-(b)+1)))-1) << (b)) -#define MASKEXPAND(mask) BITMASK(1?mask,0?mask) -#define SetBF(mask,value) ((value) << (0?mask)) -#define GetBF(var,mask) (((unsigned)((var) & MASKEXPAND(mask))) >> (0?mask) ) -#define SetBitField(value,from,to) SetBF(to, GetBF(value,from)) -#define SetBit(n) (1<<(n)) -#define Set8Bits(value) ((value)&0xff) - -#define V_DBLSCAN 1 - -typedef struct { - int bitsPerPixel; - int depth; - int displayWidth; - int weight; -} NVFBLayout; - -#define NUM_SEQ_REGS 0x05 -#define NUM_CRT_REGS 0x41 -#define NUM_GRC_REGS 0x09 -#define NUM_ATC_REGS 0x15 - -struct nvidia_par; - -struct nvidia_i2c_chan { - struct nvidia_par *par; - unsigned long ddc_base; - struct i2c_adapter adapter; - struct i2c_algo_bit_data algo; -}; - -typedef struct _riva_hw_state { - u8 attr[NUM_ATC_REGS]; - u8 crtc[NUM_CRT_REGS]; - u8 gra[NUM_GRC_REGS]; - u8 seq[NUM_SEQ_REGS]; - u8 misc_output; - u32 bpp; - u32 width; - u32 height; - u32 interlace; - u32 repaint0; - u32 repaint1; - u32 screen; - u32 scale; - u32 dither; - u32 extra; - u32 fifo; - u32 pixel; - u32 horiz; - u32 arbitration0; - u32 arbitration1; - u32 pll; - u32 pllB; - u32 vpll; - u32 vpll2; - u32 vpllB; - u32 vpll2B; - u32 pllsel; - u32 general; - u32 crtcOwner; - u32 head; - u32 head2; - u32 config; - u32 cursorConfig; - u32 cursor0; - u32 cursor1; - u32 cursor2; - u32 timingH; - u32 timingV; - u32 displayV; - u32 crtcSync; - u32 control; -} RIVA_HW_STATE; - -struct riva_regs { - RIVA_HW_STATE ext; -}; - -struct nvidia_par { - RIVA_HW_STATE SavedReg; - RIVA_HW_STATE ModeReg; - RIVA_HW_STATE initial_state; - RIVA_HW_STATE *CurrentState; - struct vgastate vgastate; - u32 pseudo_palette[16]; - struct pci_dev *pci_dev; - u32 Architecture; - u32 CursorStart; - int Chipset; - unsigned long FbAddress; - u8 __iomem *FbStart; - u32 FbMapSize; - u32 FbUsableSize; - u32 ScratchBufferSize; - u32 ScratchBufferStart; - int FpScale; - u32 MinVClockFreqKHz; - u32 MaxVClockFreqKHz; - u32 CrystalFreqKHz; - u32 RamAmountKBytes; - u32 IOBase; - NVFBLayout CurrentLayout; - int cursor_reset; - int lockup; - int videoKey; - int FlatPanel; - int FPDither; - int Television; - int CRTCnumber; - int alphaCursor; - int twoHeads; - int twoStagePLL; - int fpScaler; - int fpWidth; - int fpHeight; - int PanelTweak; - int paneltweak; - int LVDS; - int pm_state; - int reverse_i2c; - u32 crtcSync_read; - u32 fpSyncs; - u32 dmaPut; - u32 dmaCurrent; - u32 dmaFree; - u32 dmaMax; - u32 __iomem *dmaBase; - u32 currentRop; - int WaitVSyncPossible; - int BlendingPossible; - u32 paletteEnabled; - u32 forceCRTC; - u32 open_count; - u8 DDCBase; - int wc_cookie; - struct nvidia_i2c_chan chan[3]; - - volatile u32 __iomem *REGS; - volatile u32 __iomem *PCRTC0; - volatile u32 __iomem *PCRTC; - volatile u32 __iomem *PRAMDAC0; - volatile u32 __iomem *PFB; - volatile u32 __iomem *PFIFO; - volatile u32 __iomem *PGRAPH; - volatile u32 __iomem *PEXTDEV; - volatile u32 __iomem *PTIMER; - volatile u32 __iomem *PMC; - volatile u32 __iomem *PRAMIN; - volatile u32 __iomem *FIFO; - volatile u32 __iomem *CURSOR; - volatile u8 __iomem *PCIO0; - volatile u8 __iomem *PCIO; - volatile u8 __iomem *PVIO; - volatile u8 __iomem *PDIO0; - volatile u8 __iomem *PDIO; - volatile u32 __iomem *PRAMDAC; -}; - -#endif /* __NV_TYPE_H__ */ diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c deleted file mode 100644 index a372a183c1f0..000000000000 --- a/drivers/video/fbdev/nvidia/nvidia.c +++ /dev/null @@ -1,1581 +0,0 @@ -/* - * linux/drivers/video/nvidia/nvidia.c - nVidia fb driver - * - * Copyright 2004 Antonino Daplas <adaplas@pol.net> - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file COPYING in the main directory of this archive - * for more details. - * - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/errno.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/slab.h> -#include <linux/delay.h> -#include <linux/fb.h> -#include <linux/init.h> -#include <linux/pci.h> -#include <linux/console.h> -#include <linux/backlight.h> -#ifdef CONFIG_BOOTX_TEXT -#include <asm/btext.h> -#endif - -#include "nv_local.h" -#include "nv_type.h" -#include "nv_proto.h" -#include "nv_dma.h" - -#ifdef CONFIG_FB_NVIDIA_DEBUG -#define NVTRACE printk -#else -#define NVTRACE if (0) printk -#endif - -#define NVTRACE_ENTER(...) NVTRACE("%s START\n", __func__) -#define NVTRACE_LEAVE(...) NVTRACE("%s END\n", __func__) - -#ifdef CONFIG_FB_NVIDIA_DEBUG -#define assert(expr) \ - if (!(expr)) { \ - printk( "Assertion failed! %s,%s,%s,line=%d\n",\ - #expr,__FILE__,__func__,__LINE__); \ - BUG(); \ - } -#else -#define assert(expr) -#endif - -#define PFX "nvidiafb: " - -/* HW cursor parameters */ -#define MAX_CURS 32 - -static const struct pci_device_id nvidiafb_pci_tbl[] = { - {PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, - PCI_BASE_CLASS_DISPLAY << 16, 0xff0000, 0}, - { 0, } -}; -MODULE_DEVICE_TABLE(pci, nvidiafb_pci_tbl); - -/* command line data, set in nvidiafb_setup() */ -static int flatpanel = -1; /* Autodetect later */ -static int fpdither = -1; -static int forceCRTC = -1; -static int hwcur = 0; -static int noaccel = 0; -static int noscale = 0; -static int paneltweak = 0; -static int vram = 0; -static int bpp = 8; -static int reverse_i2c; -static bool nomtrr = false; -static int backlight = IS_BUILTIN(CONFIG_PMAC_BACKLIGHT); - -static char *mode_option = NULL; - -static struct fb_fix_screeninfo nvidiafb_fix = { - .type = FB_TYPE_PACKED_PIXELS, - .xpanstep = 8, - .ypanstep = 1, -}; - -static struct fb_var_screeninfo nvidiafb_default_var = { - .xres = 640, - .yres = 480, - .xres_virtual = 640, - .yres_virtual = 480, - .bits_per_pixel = 8, - .red = {0, 8, 0}, - .green = {0, 8, 0}, - .blue = {0, 8, 0}, - .transp = {0, 0, 0}, - .activate = FB_ACTIVATE_NOW, - .height = -1, - .width = -1, - .pixclock = 39721, - .left_margin = 40, - .right_margin = 24, - .upper_margin = 32, - .lower_margin = 11, - .hsync_len = 96, - .vsync_len = 2, - .vmode = FB_VMODE_NONINTERLACED -}; - -static void nvidiafb_load_cursor_image(struct nvidia_par *par, u8 * data8, - u16 bg, u16 fg, u32 w, u32 h) -{ - u32 *data = (u32 *) data8; - int i, j, k = 0; - u32 b, tmp; - - w = (w + 1) & ~1; - - for (i = 0; i < h; i++) { - b = *data++; - reverse_order(&b); - - for (j = 0; j < w / 2; j++) { - tmp = 0; -#if defined (__BIG_ENDIAN) - tmp = (b & (1 << 31)) ? fg << 16 : bg << 16; - b <<= 1; - tmp |= (b & (1 << 31)) ? fg : bg; - b <<= 1; -#else - tmp = (b & 1) ? fg : bg; - b >>= 1; - tmp |= (b & 1) ? fg << 16 : bg << 16; - b >>= 1; -#endif - NV_WR32(&par->CURSOR[k++], 0, tmp); - } - k += (MAX_CURS - w) / 2; - } -} - -static void nvidia_write_clut(struct nvidia_par *par, - u8 regnum, u8 red, u8 green, u8 blue) -{ - NVWriteDacMask(par, 0xff); - NVWriteDacWriteAddr(par, regnum); - NVWriteDacData(par, red); - NVWriteDacData(par, green); - NVWriteDacData(par, blue); -} - -static void nvidia_read_clut(struct nvidia_par *par, - u8 regnum, u8 * red, u8 * green, u8 * blue) -{ - NVWriteDacMask(par, 0xff); - NVWriteDacReadAddr(par, regnum); - *red = NVReadDacData(par); - *green = NVReadDacData(par); - *blue = NVReadDacData(par); -} - -static int nvidia_panel_tweak(struct nvidia_par *par, - struct _riva_hw_state *state) -{ - int tweak = 0; - - if (par->paneltweak) { - tweak = par->paneltweak; - } else { - /* Begin flat panel hacks. - * This is unfortunate, but some chips need this register - * tweaked or else you get artifacts where adjacent pixels are - * swapped. There are no hard rules for what to set here so all - * we can do is experiment and apply hacks. - */ - if (((par->Chipset & 0xffff) == 0x0328) && (state->bpp == 32)) { - /* At least one NV34 laptop needs this workaround. */ - tweak = -1; - } - - if ((par->Chipset & 0xfff0) == 0x0310) - tweak = 1; - /* end flat panel hacks */ - } - - return tweak; -} - -static void nvidia_screen_off(struct nvidia_par *par, int on) -{ - unsigned char tmp; - - if (on) { - /* - * Turn off screen and disable sequencer. - */ - tmp = NVReadSeq(par, 0x01); - - NVWriteSeq(par, 0x00, 0x01); /* Synchronous Reset */ - NVWriteSeq(par, 0x01, tmp | 0x20); /* disable the display */ - } else { - /* - * Reenable sequencer, then turn on screen. - */ - - tmp = NVReadSeq(par, 0x01); - - NVWriteSeq(par, 0x01, tmp & ~0x20); /* reenable display */ - NVWriteSeq(par, 0x00, 0x03); /* End Reset */ - } -} - -static void nvidia_save_vga(struct nvidia_par *par, - struct _riva_hw_state *state) -{ - int i; - - NVTRACE_ENTER(); - NVLockUnlock(par, 0); - - NVUnloadStateExt(par, state); - - state->misc_output = NVReadMiscOut(par); - - for (i = 0; i < NUM_CRT_REGS; i++) - state->crtc[i] = NVReadCrtc(par, i); - - for (i = 0; i < NUM_ATC_REGS; i++) - state->attr[i] = NVReadAttr(par, i); - - for (i = 0; i < NUM_GRC_REGS; i++) - state->gra[i] = NVReadGr(par, i); - - for (i = 0; i < NUM_SEQ_REGS; i++) - state->seq[i] = NVReadSeq(par, i); - NVTRACE_LEAVE(); -} - -#undef DUMP_REG - -static void nvidia_write_regs(struct nvidia_par *par, - struct _riva_hw_state *state) -{ - int i; - - NVTRACE_ENTER(); - - NVLoadStateExt(par, state); - - NVWriteMiscOut(par, state->misc_output); - - for (i = 1; i < NUM_SEQ_REGS; i++) { -#ifdef DUMP_REG - printk(" SEQ[%02x] = %08x\n", i, state->seq[i]); -#endif - NVWriteSeq(par, i, state->seq[i]); - } - - /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 of CRTC[17] */ - NVWriteCrtc(par, 0x11, state->crtc[0x11] & ~0x80); - - for (i = 0; i < NUM_CRT_REGS; i++) { - switch (i) { - case 0x19: - case 0x20 ... 0x40: - break; - default: -#ifdef DUMP_REG - printk("CRTC[%02x] = %08x\n", i, state->crtc[i]); -#endif - NVWriteCrtc(par, i, state->crtc[i]); - } - } - - for (i = 0; i < NUM_GRC_REGS; i++) { -#ifdef DUMP_REG - printk(" GRA[%02x] = %08x\n", i, state->gra[i]); -#endif - NVWriteGr(par, i, state->gra[i]); - } - - for (i = 0; i < NUM_ATC_REGS; i++) { -#ifdef DUMP_REG - printk("ATTR[%02x] = %08x\n", i, state->attr[i]); -#endif - NVWriteAttr(par, i, state->attr[i]); - } - - NVTRACE_LEAVE(); -} - -static int nvidia_calc_regs(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - struct _riva_hw_state *state = &par->ModeReg; - int i, depth = fb_get_color_depth(&info->var, &info->fix); - int h_display = info->var.xres / 8 - 1; - int h_start = (info->var.xres + info->var.right_margin) / 8 - 1; - int h_end = (info->var.xres + info->var.right_margin + - info->var.hsync_len) / 8 - 1; - int h_total = (info->var.xres + info->var.right_margin + - info->var.hsync_len + info->var.left_margin) / 8 - 5; - int h_blank_s = h_display; - int h_blank_e = h_total + 4; - int v_display = info->var.yres - 1; - int v_start = info->var.yres + info->var.lower_margin - 1; - int v_end = (info->var.yres + info->var.lower_margin + - info->var.vsync_len) - 1; - int v_total = (info->var.yres + info->var.lower_margin + - info->var.vsync_len + info->var.upper_margin) - 2; - int v_blank_s = v_display; - int v_blank_e = v_total + 1; - - /* - * Set all CRTC values. - */ - - if (info->var.vmode & FB_VMODE_INTERLACED) - v_total |= 1; - - if (par->FlatPanel == 1) { - v_start = v_total - 3; - v_end = v_total - 2; - v_blank_s = v_start; - h_start = h_total - 5; - h_end = h_total - 2; - h_blank_e = h_total + 4; - } - - state->crtc[0x0] = Set8Bits(h_total); - state->crtc[0x1] = Set8Bits(h_display); - state->crtc[0x2] = Set8Bits(h_blank_s); - state->crtc[0x3] = SetBitField(h_blank_e, 4: 0, 4:0) - | SetBit(7); - state->crtc[0x4] = Set8Bits(h_start); - state->crtc[0x5] = SetBitField(h_blank_e, 5: 5, 7:7) - | SetBitField(h_end, 4: 0, 4:0); - state->crtc[0x6] = SetBitField(v_total, 7: 0, 7:0); - state->crtc[0x7] = SetBitField(v_total, 8: 8, 0:0) - | SetBitField(v_display, 8: 8, 1:1) - | SetBitField(v_start, 8: 8, 2:2) - | SetBitField(v_blank_s, 8: 8, 3:3) - | SetBit(4) - | SetBitField(v_total, 9: 9, 5:5) - | SetBitField(v_display, 9: 9, 6:6) - | SetBitField(v_start, 9: 9, 7:7); - state->crtc[0x9] = SetBitField(v_blank_s, 9: 9, 5:5) - | SetBit(6) - | ((info->var.vmode & FB_VMODE_DOUBLE) ? 0x80 : 0x00); - state->crtc[0x10] = Set8Bits(v_start); - state->crtc[0x11] = SetBitField(v_end, 3: 0, 3:0) | SetBit(5); - state->crtc[0x12] = Set8Bits(v_display); - state->crtc[0x13] = ((info->var.xres_virtual / 8) * - (info->var.bits_per_pixel / 8)); - state->crtc[0x15] = Set8Bits(v_blank_s); - state->crtc[0x16] = Set8Bits(v_blank_e); - - state->attr[0x10] = 0x01; - - if (par->Television) - state->attr[0x11] = 0x00; - - state->screen = SetBitField(h_blank_e, 6: 6, 4:4) - | SetBitField(v_blank_s, 10: 10, 3:3) - | SetBitField(v_start, 10: 10, 2:2) - | SetBitField(v_display, 10: 10, 1:1) - | SetBitField(v_total, 10: 10, 0:0); - - state->horiz = SetBitField(h_total, 8: 8, 0:0) - | SetBitField(h_display, 8: 8, 1:1) - | SetBitField(h_blank_s, 8: 8, 2:2) - | SetBitField(h_start, 8: 8, 3:3); - - state->extra = SetBitField(v_total, 11: 11, 0:0) - | SetBitField(v_display, 11: 11, 2:2) - | SetBitField(v_start, 11: 11, 4:4) - | SetBitField(v_blank_s, 11: 11, 6:6); - - if (info->var.vmode & FB_VMODE_INTERLACED) { - h_total = (h_total >> 1) & ~1; - state->interlace = Set8Bits(h_total); - state->horiz |= SetBitField(h_total, 8: 8, 4:4); - } else { - state->interlace = 0xff; /* interlace off */ - } - - /* - * Calculate the extended registers. - */ - - if (depth < 24) - i = depth; - else - i = 32; - - if (par->Architecture >= NV_ARCH_10) - par->CURSOR = (volatile u32 __iomem *)(info->screen_base + - par->CursorStart); - - if (info->var.sync & FB_SYNC_HOR_HIGH_ACT) - state->misc_output &= ~0x40; - else - state->misc_output |= 0x40; - if (info->var.sync & FB_SYNC_VERT_HIGH_ACT) - state->misc_output &= ~0x80; - else - state->misc_output |= 0x80; - - NVCalcStateExt(par, state, i, info->var.xres_virtual, - info->var.xres, info->var.yres_virtual, - 1000000000 / info->var.pixclock, info->var.vmode); - - state->scale = NV_RD32(par->PRAMDAC, 0x00000848) & 0xfff000ff; - if (par->FlatPanel == 1) { - state->pixel |= (1 << 7); - - if (!par->fpScaler || (par->fpWidth <= info->var.xres) - || (par->fpHeight <= info->var.yres)) { - state->scale |= (1 << 8); - } - - if (!par->crtcSync_read) { - state->crtcSync = NV_RD32(par->PRAMDAC, 0x0828); - par->crtcSync_read = 1; - } - - par->PanelTweak = nvidia_panel_tweak(par, state); - } - - state->vpll = state->pll; - state->vpll2 = state->pll; - state->vpllB = state->pllB; - state->vpll2B = state->pllB; - - VGA_WR08(par->PCIO, 0x03D4, 0x1C); - state->fifo = VGA_RD08(par->PCIO, 0x03D5) & ~(1<<5); - - if (par->CRTCnumber) { - state->head = NV_RD32(par->PCRTC0, 0x00000860) & ~0x00001000; - state->head2 = NV_RD32(par->PCRTC0, 0x00002860) | 0x00001000; - state->crtcOwner = 3; - state->pllsel |= 0x20000800; - state->vpll = NV_RD32(par->PRAMDAC0, 0x00000508); - if (par->twoStagePLL) - state->vpllB = NV_RD32(par->PRAMDAC0, 0x00000578); - } else if (par->twoHeads) { - state->head = NV_RD32(par->PCRTC0, 0x00000860) | 0x00001000; - state->head2 = NV_RD32(par->PCRTC0, 0x00002860) & ~0x00001000; - state->crtcOwner = 0; - state->vpll2 = NV_RD32(par->PRAMDAC0, 0x0520); - if (par->twoStagePLL) - state->vpll2B = NV_RD32(par->PRAMDAC0, 0x057C); - } - - state->cursorConfig = 0x00000100; - - if (info->var.vmode & FB_VMODE_DOUBLE) - state->cursorConfig |= (1 << 4); - - if (par->alphaCursor) { - if ((par->Chipset & 0x0ff0) != 0x0110) - state->cursorConfig |= 0x04011000; - else - state->cursorConfig |= 0x14011000; - state->general |= (1 << 29); - } else - state->cursorConfig |= 0x02000000; - - if (par->twoHeads) { - if ((par->Chipset & 0x0ff0) == 0x0110) { - state->dither = NV_RD32(par->PRAMDAC, 0x0528) & - ~0x00010000; - if (par->FPDither) - state->dither |= 0x00010000; - } else { - state->dither = NV_RD32(par->PRAMDAC, 0x083C) & ~1; - if (par->FPDither) - state->dither |= 1; - } - } - - state->timingH = 0; - state->timingV = 0; - state->displayV = info->var.xres; - - return 0; -} - -static void nvidia_init_vga(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - struct _riva_hw_state *state = &par->ModeReg; - int i; - - for (i = 0; i < 0x10; i++) - state->attr[i] = i; - state->attr[0x10] = 0x41; - state->attr[0x11] = 0xff; - state->attr[0x12] = 0x0f; - state->attr[0x13] = 0x00; - state->attr[0x14] = 0x00; - - memset(state->crtc, 0x00, NUM_CRT_REGS); - state->crtc[0x0a] = 0x20; - state->crtc[0x17] = 0xe3; - state->crtc[0x18] = 0xff; - state->crtc[0x28] = 0x40; - - memset(state->gra, 0x00, NUM_GRC_REGS); - state->gra[0x05] = 0x40; - state->gra[0x06] = 0x05; - state->gra[0x07] = 0x0f; - state->gra[0x08] = 0xff; - - state->seq[0x00] = 0x03; - state->seq[0x01] = 0x01; - state->seq[0x02] = 0x0f; - state->seq[0x03] = 0x00; - state->seq[0x04] = 0x0e; - - state->misc_output = 0xeb; -} - -static int nvidiafb_cursor(struct fb_info *info, struct fb_cursor *cursor) -{ - struct nvidia_par *par = info->par; - u8 data[MAX_CURS * MAX_CURS / 8]; - int i, set = cursor->set; - u16 fg, bg; - - if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS) - return -ENXIO; - - NVShowHideCursor(par, 0); - - if (par->cursor_reset) { - set = FB_CUR_SETALL; - par->cursor_reset = 0; - } - - if (set & FB_CUR_SETSIZE) - memset_io(par->CURSOR, 0, MAX_CURS * MAX_CURS * 2); - - if (set & FB_CUR_SETPOS) { - u32 xx, yy, temp; - - yy = cursor->image.dy - info->var.yoffset; - xx = cursor->image.dx - info->var.xoffset; - temp = xx & 0xFFFF; - temp |= yy << 16; - - NV_WR32(par->PRAMDAC, 0x0000300, temp); - } - - if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) { - u32 bg_idx = cursor->image.bg_color; - u32 fg_idx = cursor->image.fg_color; - u32 s_pitch = (cursor->image.width + 7) >> 3; - u32 d_pitch = MAX_CURS / 8; - u8 *dat = (u8 *) cursor->image.data; - u8 *msk = (u8 *) cursor->mask; - u8 *src; - - src = kmalloc_array(s_pitch, cursor->image.height, GFP_ATOMIC); - - if (src) { - switch (cursor->rop) { - case ROP_XOR: - for (i = 0; i < s_pitch * cursor->image.height; i++) - src[i] = dat[i] ^ msk[i]; - break; - case ROP_COPY: - default: - for (i = 0; i < s_pitch * cursor->image.height; i++) - src[i] = dat[i] & msk[i]; - break; - } - - fb_pad_aligned_buffer(data, d_pitch, src, s_pitch, - cursor->image.height); - - bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) | - ((info->cmap.green[bg_idx] & 0xf8) << 2) | - ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | 1 << 15; - - fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) | - ((info->cmap.green[fg_idx] & 0xf8) << 2) | - ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15; - - NVLockUnlock(par, 0); - - nvidiafb_load_cursor_image(par, data, bg, fg, - cursor->image.width, - cursor->image.height); - kfree(src); - } - } - - if (cursor->enable) - NVShowHideCursor(par, 1); - - return 0; -} - -static struct fb_ops nvidia_fb_ops; - -static int nvidiafb_set_par(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - - NVTRACE_ENTER(); - - NVLockUnlock(par, 1); - if (!par->FlatPanel || !par->twoHeads) - par->FPDither = 0; - - if (par->FPDither < 0) { - if ((par->Chipset & 0x0ff0) == 0x0110) - par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x0528) - & 0x00010000); - else - par->FPDither = !!(NV_RD32(par->PRAMDAC, 0x083C) & 1); - printk(KERN_INFO PFX "Flat panel dithering %s\n", - par->FPDither ? "enabled" : "disabled"); - } - - info->fix.visual = (info->var.bits_per_pixel == 8) ? - FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR; - - nvidia_init_vga(info); - nvidia_calc_regs(info); - - NVLockUnlock(par, 0); - if (par->twoHeads) { - VGA_WR08(par->PCIO, 0x03D4, 0x44); - VGA_WR08(par->PCIO, 0x03D5, par->ModeReg.crtcOwner); - NVLockUnlock(par, 0); - } - - nvidia_screen_off(par, 1); - - nvidia_write_regs(par, &par->ModeReg); - NVSetStartAddress(par, 0); - -#if defined (__BIG_ENDIAN) - /* turn on LFB swapping */ - { - unsigned char tmp; - - VGA_WR08(par->PCIO, 0x3d4, 0x46); - tmp = VGA_RD08(par->PCIO, 0x3d5); - tmp |= (1 << 7); - VGA_WR08(par->PCIO, 0x3d5, tmp); - } -#endif - - info->fix.line_length = (info->var.xres_virtual * - info->var.bits_per_pixel) >> 3; - if (info->var.accel_flags) { - nvidia_fb_ops.fb_imageblit = nvidiafb_imageblit; - nvidia_fb_ops.fb_fillrect = nvidiafb_fillrect; - nvidia_fb_ops.fb_copyarea = nvidiafb_copyarea; - nvidia_fb_ops.fb_sync = nvidiafb_sync; - info->pixmap.scan_align = 4; - info->flags &= ~FBINFO_HWACCEL_DISABLED; - info->flags |= FBINFO_READS_FAST; - NVResetGraphics(info); - } else { - nvidia_fb_ops.fb_imageblit = cfb_imageblit; - nvidia_fb_ops.fb_fillrect = cfb_fillrect; - nvidia_fb_ops.fb_copyarea = cfb_copyarea; - nvidia_fb_ops.fb_sync = NULL; - info->pixmap.scan_align = 1; - info->flags |= FBINFO_HWACCEL_DISABLED; - info->flags &= ~FBINFO_READS_FAST; - } - - par->cursor_reset = 1; - - nvidia_screen_off(par, 0); - -#ifdef CONFIG_BOOTX_TEXT - /* Update debug text engine */ - btext_update_display(info->fix.smem_start, - info->var.xres, info->var.yres, - info->var.bits_per_pixel, info->fix.line_length); -#endif - - NVLockUnlock(par, 0); - NVTRACE_LEAVE(); - return 0; -} - -static int nvidiafb_setcolreg(unsigned regno, unsigned red, unsigned green, - unsigned blue, unsigned transp, - struct fb_info *info) -{ - struct nvidia_par *par = info->par; - int i; - - NVTRACE_ENTER(); - if (regno >= (1 << info->var.green.length)) - return -EINVAL; - - if (info->var.grayscale) { - /* gray = 0.30*R + 0.59*G + 0.11*B */ - red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8; - } - - if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) { - ((u32 *) info->pseudo_palette)[regno] = - (regno << info->var.red.offset) | - (regno << info->var.green.offset) | - (regno << info->var.blue.offset); - } - - switch (info->var.bits_per_pixel) { - case 8: - /* "transparent" stuff is completely ignored. */ - nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8); - break; - case 16: - if (info->var.green.length == 5) { - for (i = 0; i < 8; i++) { - nvidia_write_clut(par, regno * 8 + i, red >> 8, - green >> 8, blue >> 8); - } - } else { - u8 r, g, b; - - if (regno < 32) { - for (i = 0; i < 8; i++) { - nvidia_write_clut(par, regno * 8 + i, - red >> 8, green >> 8, - blue >> 8); - } - } - - nvidia_read_clut(par, regno * 4, &r, &g, &b); - - for (i = 0; i < 4; i++) - nvidia_write_clut(par, regno * 4 + i, r, - green >> 8, b); - } - break; - case 32: - nvidia_write_clut(par, regno, red >> 8, green >> 8, blue >> 8); - break; - default: - /* do nothing */ - break; - } - - NVTRACE_LEAVE(); - return 0; -} - -static int nvidiafb_check_var(struct fb_var_screeninfo *var, - struct fb_info *info) -{ - struct nvidia_par *par = info->par; - int memlen, vramlen, mode_valid = 0; - int pitch, err = 0; - - NVTRACE_ENTER(); - - var->transp.offset = 0; - var->transp.length = 0; - - var->xres &= ~7; - - if (var->bits_per_pixel <= 8) - var->bits_per_pixel = 8; - else if (var->bits_per_pixel <= 16) - var->bits_per_pixel = 16; - else - var->bits_per_pixel = 32; - - switch (var->bits_per_pixel) { - case 8: - var->red.offset = 0; - var->red.length = 8; - var->green.offset = 0; - var->green.length = 8; - var->blue.offset = 0; - var->blue.length = 8; - var->transp.offset = 0; - var->transp.length = 0; - break; - case 16: - var->green.length = (var->green.length < 6) ? 5 : 6; - var->red.length = 5; - var->blue.length = 5; - var->transp.length = 6 - var->green.length; - var->blue.offset = 0; - var->green.offset = 5; - var->red.offset = 5 + var->green.length; - var->transp.offset = (5 + var->red.offset) & 15; - break; - case 32: /* RGBA 8888 */ - var->red.offset = 16; - var->red.length = 8; - var->green.offset = 8; - var->green.length = 8; - var->blue.offset = 0; - var->blue.length = 8; - var->transp.length = 8; - var->transp.offset = 24; - break; - } - - var->red.msb_right = 0; - var->green.msb_right = 0; - var->blue.msb_right = 0; - var->transp.msb_right = 0; - - if (!info->monspecs.hfmax || !info->monspecs.vfmax || - !info->monspecs.dclkmax || !fb_validate_mode(var, info)) - mode_valid = 1; - - /* calculate modeline if supported by monitor */ - if (!mode_valid && info->monspecs.gtf) { - if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info)) - mode_valid = 1; - } - - if (!mode_valid) { - const struct fb_videomode *mode; - - mode = fb_find_best_mode(var, &info->modelist); - if (mode) { - fb_videomode_to_var(var, mode); - mode_valid = 1; - } - } - - if (!mode_valid && info->monspecs.modedb_len) - return -EINVAL; - - /* - * If we're on a flat panel, check if the mode is outside of the - * panel dimensions. If so, cap it and try for the next best mode - * before bailing out. - */ - if (par->fpWidth && par->fpHeight && (par->fpWidth < var->xres || - par->fpHeight < var->yres)) { - const struct fb_videomode *mode; - - var->xres = par->fpWidth; - var->yres = par->fpHeight; - - mode = fb_find_best_mode(var, &info->modelist); - if (!mode) { - printk(KERN_ERR PFX "mode out of range of flat " - "panel dimensions\n"); - return -EINVAL; - } - - fb_videomode_to_var(var, mode); - } - - if (var->yres_virtual < var->yres) - var->yres_virtual = var->yres; - - if (var->xres_virtual < var->xres) - var->xres_virtual = var->xres; - - var->xres_virtual = (var->xres_virtual + 63) & ~63; - - vramlen = info->screen_size; - pitch = ((var->xres_virtual * var->bits_per_pixel) + 7) / 8; - memlen = pitch * var->yres_virtual; - - if (memlen > vramlen) { - var->yres_virtual = vramlen / pitch; - - if (var->yres_virtual < var->yres) { - var->yres_virtual = var->yres; - var->xres_virtual = vramlen / var->yres_virtual; - var->xres_virtual /= var->bits_per_pixel / 8; - var->xres_virtual &= ~63; - pitch = (var->xres_virtual * - var->bits_per_pixel + 7) / 8; - memlen = pitch * var->yres; - - if (var->xres_virtual < var->xres) { - printk("nvidiafb: required video memory, " - "%d bytes, for %dx%d-%d (virtual) " - "is out of range\n", - memlen, var->xres_virtual, - var->yres_virtual, var->bits_per_pixel); - err = -ENOMEM; - } - } - } - - if (var->accel_flags) { - if (var->yres_virtual > 0x7fff) - var->yres_virtual = 0x7fff; - if (var->xres_virtual > 0x7fff) - var->xres_virtual = 0x7fff; - } - - var->xres_virtual &= ~63; - - NVTRACE_LEAVE(); - - return err; -} - -static int nvidiafb_pan_display(struct fb_var_screeninfo *var, - struct fb_info *info) -{ - struct nvidia_par *par = info->par; - u32 total; - - total = var->yoffset * info->fix.line_length + var->xoffset; - - NVSetStartAddress(par, total); - - return 0; -} - -static int nvidiafb_blank(int blank, struct fb_info *info) -{ - struct nvidia_par *par = info->par; - unsigned char tmp, vesa; - - tmp = NVReadSeq(par, 0x01) & ~0x20; /* screen on/off */ - vesa = NVReadCrtc(par, 0x1a) & ~0xc0; /* sync on/off */ - - NVTRACE_ENTER(); - - if (blank) - tmp |= 0x20; - - switch (blank) { - case FB_BLANK_UNBLANK: - case FB_BLANK_NORMAL: - break; - case FB_BLANK_VSYNC_SUSPEND: - vesa |= 0x80; - break; - case FB_BLANK_HSYNC_SUSPEND: - vesa |= 0x40; - break; - case FB_BLANK_POWERDOWN: - vesa |= 0xc0; - break; - } - - NVWriteSeq(par, 0x01, tmp); - NVWriteCrtc(par, 0x1a, vesa); - - NVTRACE_LEAVE(); - - return 0; -} - -/* - * Because the VGA registers are not mapped linearly in its MMIO space, - * restrict VGA register saving and restore to x86 only, where legacy VGA IO - * access is legal. Consequently, we must also check if the device is the - * primary display. - */ -#ifdef CONFIG_X86 -static void save_vga_x86(struct nvidia_par *par) -{ - struct resource *res= &par->pci_dev->resource[PCI_ROM_RESOURCE]; - - if (res && res->flags & IORESOURCE_ROM_SHADOW) { - memset(&par->vgastate, 0, sizeof(par->vgastate)); - par->vgastate.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS | - VGA_SAVE_CMAP; - save_vga(&par->vgastate); - } -} - -static void restore_vga_x86(struct nvidia_par *par) -{ - struct resource *res= &par->pci_dev->resource[PCI_ROM_RESOURCE]; - - if (res && res->flags & IORESOURCE_ROM_SHADOW) - restore_vga(&par->vgastate); -} -#else -#define save_vga_x86(x) do {} while (0) -#define restore_vga_x86(x) do {} while (0) -#endif /* X86 */ - -static int nvidiafb_open(struct fb_info *info, int user) -{ - struct nvidia_par *par = info->par; - - if (!par->open_count) { - save_vga_x86(par); - nvidia_save_vga(par, &par->initial_state); - } - - par->open_count++; - return 0; -} - -static int nvidiafb_release(struct fb_info *info, int user) -{ - struct nvidia_par *par = info->par; - int err = 0; - - if (!par->open_count) { - err = -EINVAL; - goto done; - } - - if (par->open_count == 1) { - nvidia_write_regs(par, &par->initial_state); - restore_vga_x86(par); - } - - par->open_count--; -done: - return err; -} - -static struct fb_ops nvidia_fb_ops = { - .owner = THIS_MODULE, - .fb_open = nvidiafb_open, - .fb_release = nvidiafb_release, - .fb_check_var = nvidiafb_check_var, - .fb_set_par = nvidiafb_set_par, - .fb_setcolreg = nvidiafb_setcolreg, - .fb_pan_display = nvidiafb_pan_display, - .fb_blank = nvidiafb_blank, - .fb_fillrect = nvidiafb_fillrect, - .fb_copyarea = nvidiafb_copyarea, - .fb_imageblit = nvidiafb_imageblit, - .fb_cursor = nvidiafb_cursor, - .fb_sync = nvidiafb_sync, -}; - -static int nvidiafb_suspend_late(struct device *dev, pm_message_t mesg) -{ - struct fb_info *info = dev_get_drvdata(dev); - struct nvidia_par *par = info->par; - - if (mesg.event == PM_EVENT_PRETHAW) - mesg.event = PM_EVENT_FREEZE; - console_lock(); - par->pm_state = mesg.event; - - if (mesg.event & PM_EVENT_SLEEP) { - fb_set_suspend(info, 1); - nvidiafb_blank(FB_BLANK_POWERDOWN, info); - nvidia_write_regs(par, &par->SavedReg); - } - dev->power.power_state = mesg; - - console_unlock(); - return 0; -} - -static int __maybe_unused nvidiafb_suspend(struct device *dev) -{ - return nvidiafb_suspend_late(dev, PMSG_SUSPEND); -} - -static int __maybe_unused nvidiafb_hibernate(struct device *dev) -{ - return nvidiafb_suspend_late(dev, PMSG_HIBERNATE); -} - -static int __maybe_unused nvidiafb_freeze(struct device *dev) -{ - return nvidiafb_suspend_late(dev, PMSG_FREEZE); -} - -static int __maybe_unused nvidiafb_resume(struct device *dev) -{ - struct fb_info *info = dev_get_drvdata(dev); - struct nvidia_par *par = info->par; - - console_lock(); - - par->pm_state = PM_EVENT_ON; - nvidiafb_set_par(info); - fb_set_suspend (info, 0); - nvidiafb_blank(FB_BLANK_UNBLANK, info); - - console_unlock(); - return 0; -} - -static const struct dev_pm_ops nvidiafb_pm_ops = { -#ifdef CONFIG_PM_SLEEP - .suspend = nvidiafb_suspend, - .resume = nvidiafb_resume, - .freeze = nvidiafb_freeze, - .thaw = nvidiafb_resume, - .poweroff = nvidiafb_hibernate, - .restore = nvidiafb_resume, -#endif /* CONFIG_PM_SLEEP */ -}; - -static int nvidia_set_fbinfo(struct fb_info *info) -{ - struct fb_monspecs *specs = &info->monspecs; - struct fb_videomode modedb; - struct nvidia_par *par = info->par; - int lpitch; - - NVTRACE_ENTER(); - info->flags = FBINFO_DEFAULT - | FBINFO_HWACCEL_IMAGEBLIT - | FBINFO_HWACCEL_FILLRECT - | FBINFO_HWACCEL_COPYAREA - | FBINFO_HWACCEL_YPAN; - - fb_videomode_to_modelist(info->monspecs.modedb, - info->monspecs.modedb_len, &info->modelist); - fb_var_to_videomode(&modedb, &nvidiafb_default_var); - - switch (bpp) { - case 0 ... 8: - bpp = 8; - break; - case 9 ... 16: - bpp = 16; - break; - default: - bpp = 32; - break; - } - - if (specs->modedb != NULL) { - const struct fb_videomode *mode; - - mode = fb_find_best_display(specs, &info->modelist); - fb_videomode_to_var(&nvidiafb_default_var, mode); - nvidiafb_default_var.bits_per_pixel = bpp; - } else if (par->fpWidth && par->fpHeight) { - char buf[16]; - - memset(buf, 0, 16); - snprintf(buf, 15, "%dx%dMR", par->fpWidth, par->fpHeight); - fb_find_mode(&nvidiafb_default_var, info, buf, specs->modedb, - specs->modedb_len, &modedb, bpp); - } - - if (mode_option) - fb_find_mode(&nvidiafb_default_var, info, mode_option, - specs->modedb, specs->modedb_len, &modedb, bpp); - - info->var = nvidiafb_default_var; - info->fix.visual = (info->var.bits_per_pixel == 8) ? - FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR; - info->pseudo_palette = par->pseudo_palette; - fb_alloc_cmap(&info->cmap, 256, 0); - fb_destroy_modedb(info->monspecs.modedb); - info->monspecs.modedb = NULL; - - /* maximize virtual vertical length */ - lpitch = info->var.xres_virtual * - ((info->var.bits_per_pixel + 7) >> 3); - info->var.yres_virtual = info->screen_size / lpitch; - - info->pixmap.scan_align = 4; - info->pixmap.buf_align = 4; - info->pixmap.access_align = 32; - info->pixmap.size = 8 * 1024; - info->pixmap.flags = FB_PIXMAP_SYSTEM; - - if (!hwcur) - nvidia_fb_ops.fb_cursor = NULL; - - info->var.accel_flags = (!noaccel); - - switch (par->Architecture) { - case NV_ARCH_04: - info->fix.accel = FB_ACCEL_NV4; - break; - case NV_ARCH_10: - info->fix.accel = FB_ACCEL_NV_10; - break; - case NV_ARCH_20: - info->fix.accel = FB_ACCEL_NV_20; - break; - case NV_ARCH_30: - info->fix.accel = FB_ACCEL_NV_30; - break; - case NV_ARCH_40: - info->fix.accel = FB_ACCEL_NV_40; - break; - } - - NVTRACE_LEAVE(); - - return nvidiafb_check_var(&info->var, info); -} - -static u32 nvidia_get_chipset(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device; - - printk(KERN_INFO PFX "Device ID: %x \n", id); - - if ((id & 0xfff0) == 0x00f0 || - (id & 0xfff0) == 0x02e0) { - /* pci-e */ - id = NV_RD32(par->REGS, 0x1800); - - if ((id & 0x0000ffff) == 0x000010DE) - id = 0x10DE0000 | (id >> 16); - else if ((id & 0xffff0000) == 0xDE100000) /* wrong endian */ - id = 0x10DE0000 | ((id << 8) & 0x0000ff00) | - ((id >> 8) & 0x000000ff); - printk(KERN_INFO PFX "Subsystem ID: %x \n", id); - } - - return id; -} - -static u32 nvidia_get_arch(struct fb_info *info) -{ - struct nvidia_par *par = info->par; - u32 arch = 0; - - switch (par->Chipset & 0x0ff0) { - case 0x0100: /* GeForce 256 */ - case 0x0110: /* GeForce2 MX */ - case 0x0150: /* GeForce2 */ - case 0x0170: /* GeForce4 MX */ - case 0x0180: /* GeForce4 MX (8x AGP) */ - case 0x01A0: /* nForce */ - case 0x01F0: /* nForce2 */ - arch = NV_ARCH_10; - break; - case 0x0200: /* GeForce3 */ - case 0x0250: /* GeForce4 Ti */ - case 0x0280: /* GeForce4 Ti (8x AGP) */ - arch = NV_ARCH_20; - break; - case 0x0300: /* GeForceFX 5800 */ - case 0x0310: /* GeForceFX 5600 */ - case 0x0320: /* GeForceFX 5200 */ - case 0x0330: /* GeForceFX 5900 */ - case 0x0340: /* GeForceFX 5700 */ - arch = NV_ARCH_30; - break; - case 0x0040: /* GeForce 6800 */ - case 0x00C0: /* GeForce 6800 */ - case 0x0120: /* GeForce 6800 */ - case 0x0140: /* GeForce 6600 */ - case 0x0160: /* GeForce 6200 */ - case 0x01D0: /* GeForce 7200, 7300, 7400 */ - case 0x0090: /* GeForce 7800 */ - case 0x0210: /* GeForce 6800 */ - case 0x0220: /* GeForce 6200 */ - case 0x0240: /* GeForce 6100 */ - case 0x0290: /* GeForce 7900 */ - case 0x0390: /* GeForce 7600 */ - case 0x03D0: - arch = NV_ARCH_40; - break; - case 0x0020: /* TNT, TNT2 */ - arch = NV_ARCH_04; - break; - default: /* unknown architecture */ - break; - } - - return arch; -} - -static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent) -{ - struct nvidia_par *par; - struct fb_info *info; - unsigned short cmd; - - - NVTRACE_ENTER(); - assert(pd != NULL); - - info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev); - - if (!info) - goto err_out; - - par = info->par; - par->pci_dev = pd; - info->pixmap.addr = kzalloc(8 * 1024, GFP_KERNEL); - - if (info->pixmap.addr == NULL) - goto err_out_kfree; - - if (pci_enable_device(pd)) { - printk(KERN_ERR PFX "cannot enable PCI device\n"); - goto err_out_enable; - } - - if (pci_request_regions(pd, "nvidiafb")) { - printk(KERN_ERR PFX "cannot request PCI regions\n"); - goto err_out_enable; - } - - par->FlatPanel = flatpanel; - if (flatpanel == 1) - printk(KERN_INFO PFX "flatpanel support enabled\n"); - par->FPDither = fpdither; - - par->CRTCnumber = forceCRTC; - par->FpScale = (!noscale); - par->paneltweak = paneltweak; - par->reverse_i2c = reverse_i2c; - - /* enable IO and mem if not already done */ - pci_read_config_word(pd, PCI_COMMAND, &cmd); - cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY); - pci_write_config_word(pd, PCI_COMMAND, cmd); - - nvidiafb_fix.mmio_start = pci_resource_start(pd, 0); - nvidiafb_fix.smem_start = pci_resource_start(pd, 1); - nvidiafb_fix.mmio_len = pci_resource_len(pd, 0); - - par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len); - - if (!par->REGS) { - printk(KERN_ERR PFX "cannot ioremap MMIO base\n"); - goto err_out_free_base0; - } - - par->Chipset = nvidia_get_chipset(info); - par->Architecture = nvidia_get_arch(info); - - if (par->Architecture == 0) { - printk(KERN_ERR PFX "unknown NV_ARCH\n"); - goto err_out_arch; - } - - sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4); - - if (NVCommonSetup(info)) - goto err_out_arch; - - par->FbAddress = nvidiafb_fix.smem_start; - par->FbMapSize = par->RamAmountKBytes * 1024; - if (vram && vram * 1024 * 1024 < par->FbMapSize) - par->FbMapSize = vram * 1024 * 1024; - - /* Limit amount of vram to 64 MB */ - if (par->FbMapSize > 64 * 1024 * 1024) - par->FbMapSize = 64 * 1024 * 1024; - - if(par->Architecture >= NV_ARCH_40) - par->FbUsableSize = par->FbMapSize - (560 * 1024); - else - par->FbUsableSize = par->FbMapSize - (128 * 1024); - par->ScratchBufferSize = (par->Architecture < NV_ARCH_10) ? 8 * 1024 : - 16 * 1024; - par->ScratchBufferStart = par->FbUsableSize - par->ScratchBufferSize; - par->CursorStart = par->FbUsableSize + (32 * 1024); - - info->screen_base = ioremap_wc(nvidiafb_fix.smem_start, - par->FbMapSize); - info->screen_size = par->FbUsableSize; - nvidiafb_fix.smem_len = par->RamAmountKBytes * 1024; - - if (!info->screen_base) { - printk(KERN_ERR PFX "cannot ioremap FB base\n"); - goto err_out_free_base1; - } - - par->FbStart = info->screen_base; - - if (!nomtrr) - par->wc_cookie = arch_phys_wc_add(nvidiafb_fix.smem_start, - par->RamAmountKBytes * 1024); - - info->fbops = &nvidia_fb_ops; - info->fix = nvidiafb_fix; - - if (nvidia_set_fbinfo(info) < 0) { - printk(KERN_ERR PFX "error setting initial video mode\n"); - goto err_out_iounmap_fb; - } - - nvidia_save_vga(par, &par->SavedReg); - - pci_set_drvdata(pd, info); - - if (backlight) - nvidia_bl_init(par); - - if (register_framebuffer(info) < 0) { - printk(KERN_ERR PFX "error registering nVidia framebuffer\n"); - goto err_out_iounmap_fb; - } - - - printk(KERN_INFO PFX - "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n", - info->fix.id, - par->FbMapSize / (1024 * 1024), info->fix.smem_start); - - NVTRACE_LEAVE(); - return 0; - -err_out_iounmap_fb: - iounmap(info->screen_base); -err_out_free_base1: - fb_destroy_modedb(info->monspecs.modedb); - nvidia_delete_i2c_busses(par); -err_out_arch: - iounmap(par->REGS); - err_out_free_base0: - pci_release_regions(pd); -err_out_enable: - kfree(info->pixmap.addr); -err_out_kfree: - framebuffer_release(info); -err_out: - return -ENODEV; -} - -static void nvidiafb_remove(struct pci_dev *pd) -{ - struct fb_info *info = pci_get_drvdata(pd); - struct nvidia_par *par = info->par; - - NVTRACE_ENTER(); - - unregister_framebuffer(info); - - nvidia_bl_exit(par); - arch_phys_wc_del(par->wc_cookie); - iounmap(info->screen_base); - fb_destroy_modedb(info->monspecs.modedb); - nvidia_delete_i2c_busses(par); - iounmap(par->REGS); - pci_release_regions(pd); - kfree(info->pixmap.addr); - framebuffer_release(info); - NVTRACE_LEAVE(); -} - -/* ------------------------------------------------------------------------- * - * - * initialization - * - * ------------------------------------------------------------------------- */ - -#ifndef MODULE -static int nvidiafb_setup(char *options) -{ - char *this_opt; - - NVTRACE_ENTER(); - if (!options || !*options) - return 0; - - while ((this_opt = strsep(&options, ",")) != NULL) { - if (!strncmp(this_opt, "forceCRTC", 9)) { - char *p; - - p = this_opt + 9; - if (!*p || !*(++p)) - continue; - forceCRTC = *p - '0'; - if (forceCRTC < 0 || forceCRTC > 1) - forceCRTC = -1; - } else if (!strncmp(this_opt, "flatpanel", 9)) { - flatpanel = 1; - } else if (!strncmp(this_opt, "hwcur", 5)) { - hwcur = 1; - } else if (!strncmp(this_opt, "noaccel", 6)) { - noaccel = 1; - } else if (!strncmp(this_opt, "noscale", 7)) { - noscale = 1; - } else if (!strncmp(this_opt, "reverse_i2c", 11)) { - reverse_i2c = 1; - } else if (!strncmp(this_opt, "paneltweak:", 11)) { - paneltweak = simple_strtoul(this_opt+11, NULL, 0); - } else if (!strncmp(this_opt, "vram:", 5)) { - vram = simple_strtoul(this_opt+5, NULL, 0); - } else if (!strncmp(this_opt, "backlight:", 10)) { - backlight = simple_strtoul(this_opt+10, NULL, 0); - } else if (!strncmp(this_opt, "nomtrr", 6)) { - nomtrr = true; - } else if (!strncmp(this_opt, "fpdither:", 9)) { - fpdither = simple_strtol(this_opt+9, NULL, 0); - } else if (!strncmp(this_opt, "bpp:", 4)) { - bpp = simple_strtoul(this_opt+4, NULL, 0); - } else - mode_option = this_opt; - } - NVTRACE_LEAVE(); - return 0; -} -#endif /* !MODULE */ - -static struct pci_driver nvidiafb_driver = { - .name = "nvidiafb", - .id_table = nvidiafb_pci_tbl, - .probe = nvidiafb_probe, - .driver.pm = &nvidiafb_pm_ops, - .remove = nvidiafb_remove, -}; - -/* ------------------------------------------------------------------------- * - * - * modularization - * - * ------------------------------------------------------------------------- */ - -static int nvidiafb_init(void) -{ -#ifndef MODULE - char *option = NULL; - - if (fb_get_options("nvidiafb", &option)) - return -ENODEV; - nvidiafb_setup(option); -#endif - return pci_register_driver(&nvidiafb_driver); -} - -module_init(nvidiafb_init); - -static void __exit nvidiafb_exit(void) -{ - pci_unregister_driver(&nvidiafb_driver); -} - -module_exit(nvidiafb_exit); - -module_param(flatpanel, int, 0); -MODULE_PARM_DESC(flatpanel, - "Enables experimental flat panel support for some chipsets. " - "(0=disabled, 1=enabled, -1=autodetect) (default=-1)"); -module_param(fpdither, int, 0); -MODULE_PARM_DESC(fpdither, - "Enables dithering of flat panel for 6 bits panels. " - "(0=disabled, 1=enabled, -1=autodetect) (default=-1)"); -module_param(hwcur, int, 0); -MODULE_PARM_DESC(hwcur, - "Enables hardware cursor implementation. (0 or 1=enabled) " - "(default=0)"); -module_param(noaccel, int, 0); -MODULE_PARM_DESC(noaccel, - "Disables hardware acceleration. (0 or 1=disable) " - "(default=0)"); -module_param(noscale, int, 0); -MODULE_PARM_DESC(noscale, - "Disables screen scaling. (0 or 1=disable) " - "(default=0, do scaling)"); -module_param(paneltweak, int, 0); -MODULE_PARM_DESC(paneltweak, - "Tweak display settings for flatpanels. " - "(default=0, no tweaks)"); -module_param(forceCRTC, int, 0); -MODULE_PARM_DESC(forceCRTC, - "Forces usage of a particular CRTC in case autodetection " - "fails. (0 or 1) (default=autodetect)"); -module_param(vram, int, 0); -MODULE_PARM_DESC(vram, - "amount of framebuffer memory to remap in MiB" - "(default=0 - remap entire memory)"); -module_param(mode_option, charp, 0); -MODULE_PARM_DESC(mode_option, "Specify initial video mode"); -module_param(bpp, int, 0); -MODULE_PARM_DESC(bpp, "pixel width in bits" - "(default=8)"); -module_param(reverse_i2c, int, 0); -MODULE_PARM_DESC(reverse_i2c, "reverse port assignment of the i2c bus"); -module_param(nomtrr, bool, false); -MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) " - "(default=0)"); - -MODULE_AUTHOR("Antonino Daplas"); -MODULE_DESCRIPTION("Framebuffer driver for nVidia graphics chipset"); -MODULE_LICENSE("GPL"); diff --git a/drivers/video/fbdev/riva/Makefile b/drivers/video/fbdev/riva/Makefile deleted file mode 100644 index bdbdd6eb80ec..000000000000 --- a/drivers/video/fbdev/riva/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Makefile for the Riva framebuffer driver -# - -obj-$(CONFIG_FB_RIVA) += rivafb.o - -rivafb-objs := fbdev.o riva_hw.o nv_driver.o - -ifdef CONFIG_FB_RIVA_I2C - rivafb-objs += rivafb-i2c.o -endif diff --git a/drivers/video/fbdev/riva/fbdev.c b/drivers/video/fbdev/riva/fbdev.c deleted file mode 100644 index 7dd621c7afe4..000000000000 --- a/drivers/video/fbdev/riva/fbdev.c +++ /dev/null @@ -1,2195 +0,0 @@ -/* - * linux/drivers/video/riva/fbdev.c - nVidia RIVA 128/TNT/TNT2 fb driver - * - * Maintained by Ani Joshi <ajoshi@shell.unixbox.com> - * - * Copyright 1999-2000 Jeff Garzik - * - * Contributors: - * - * Ani Joshi: Lots of debugging and cleanup work, really helped - * get the driver going - * - * Ferenc Bakonyi: Bug fixes, cleanup, modularization - * - * Jindrich Makovicka: Accel code help, hw cursor, mtrr - * - * Paul Richards: Bug fixes, updates - * - * Initial template from skeletonfb.c, created 28 Dec 1997 by Geert Uytterhoeven - * Includes riva_hw.c from nVidia, see copyright below. - * KGI code provided the basis for state storage, init, and mode switching. - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file COPYING in the main directory of this archive - * for more details. - * - * Known bugs and issues: - * restoring text mode fails - * doublescan modes are broken - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/errno.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/slab.h> -#include <linux/delay.h> -#include <linux/fb.h> -#include <linux/init.h> -#include <linux/pci.h> -#include <linux/backlight.h> -#include <linux/bitrev.h> -#ifdef CONFIG_PMAC_BACKLIGHT -#include <asm/machdep.h> -#include <asm/backlight.h> -#endif - -#include "rivafb.h" -#include "nvreg.h" - -/* version number of this driver */ -#define RIVAFB_VERSION "0.9.5b" - -/* ------------------------------------------------------------------------- * - * - * various helpful macros and constants - * - * ------------------------------------------------------------------------- */ -#ifdef CONFIG_FB_RIVA_DEBUG -#define NVTRACE printk -#else -#define NVTRACE if(0) printk -#endif - -#define NVTRACE_ENTER(...) NVTRACE("%s START\n", __func__) -#define NVTRACE_LEAVE(...) NVTRACE("%s END\n", __func__) - -#ifdef CONFIG_FB_RIVA_DEBUG -#define assert(expr) \ - if(!(expr)) { \ - printk( "Assertion failed! %s,%s,%s,line=%d\n",\ - #expr,__FILE__,__func__,__LINE__); \ - BUG(); \ - } -#else -#define assert(expr) -#endif - -#define PFX "rivafb: " - -/* macro that allows you to set overflow bits */ -#define SetBitField(value,from,to) SetBF(to,GetBF(value,from)) -#define SetBit(n) (1<<(n)) -#define Set8Bits(value) ((value)&0xff) - -/* HW cursor parameters */ -#define MAX_CURS 32 - -/* ------------------------------------------------------------------------- * - * - * prototypes - * - * ------------------------------------------------------------------------- */ - -static int rivafb_blank(int blank, struct fb_info *info); - -/* ------------------------------------------------------------------------- * - * - * card identification - * - * ------------------------------------------------------------------------- */ - -static const struct pci_device_id rivafb_pci_tbl[] = { - { PCI_VENDOR_ID_NVIDIA_SGS, PCI_DEVICE_ID_NVIDIA_SGS_RIVA128, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_TNT2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UTNT2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_VTNT2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_UVTNT2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_ITNT2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GO, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_MXR, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE2_ULTRA, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO2_PRO, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_460, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - // NF2/IGP version, GeForce 4 MX, NV18 - { PCI_VENDOR_ID_NVIDIA, 0x01f0, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO_M32, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500XGL, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO_M64, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_200, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_550XGL, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_500_GOGL, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_IGEFORCE2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_1, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE3_2, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO_DDC, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4600, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4400, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4200, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO_5200, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { 0, } /* terminate list */ -}; -MODULE_DEVICE_TABLE(pci, rivafb_pci_tbl); - -/* ------------------------------------------------------------------------- * - * - * global variables - * - * ------------------------------------------------------------------------- */ - -/* command line data, set in rivafb_setup() */ -static int flatpanel = -1; /* Autodetect later */ -static int forceCRTC = -1; -static bool noaccel = 0; -static bool nomtrr = 0; -static int backlight = IS_BUILTIN(CONFIG_PMAC_BACKLIGHT); - -static char *mode_option = NULL; -static bool strictmode = 0; - -static struct fb_fix_screeninfo rivafb_fix = { - .type = FB_TYPE_PACKED_PIXELS, - .xpanstep = 1, - .ypanstep = 1, -}; - -static struct fb_var_screeninfo rivafb_default_var = { - .xres = 640, - .yres = 480, - .xres_virtual = 640, - .yres_virtual = 480, - .bits_per_pixel = 8, - .red = {0, 8, 0}, - .green = {0, 8, 0}, - .blue = {0, 8, 0}, - .transp = {0, 0, 0}, - .activate = FB_ACTIVATE_NOW, - .height = -1, - .width = -1, - .pixclock = 39721, - .left_margin = 40, - .right_margin = 24, - .upper_margin = 32, - .lower_margin = 11, - .hsync_len = 96, - .vsync_len = 2, - .vmode = FB_VMODE_NONINTERLACED -}; - -/* from GGI */ -static const struct riva_regs reg_template = { - {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* ATTR */ - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x41, 0x01, 0x0F, 0x00, 0x00}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* CRT */ - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, /* 0x10 */ - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20 */ - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30 */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, /* 0x40 */ - }, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, /* GRA */ - 0xFF}, - {0x03, 0x01, 0x0F, 0x00, 0x0E}, /* SEQ */ - 0xEB /* MISC */ -}; - -/* - * Backlight control - */ -#ifdef CONFIG_FB_RIVA_BACKLIGHT -/* We do not have any information about which values are allowed, thus - * we used safe values. - */ -#define MIN_LEVEL 0x158 -#define MAX_LEVEL 0x534 -#define LEVEL_STEP ((MAX_LEVEL - MIN_LEVEL) / FB_BACKLIGHT_MAX) - -static int riva_bl_get_level_brightness(struct riva_par *par, - int level) -{ - struct fb_info *info = pci_get_drvdata(par->pdev); - int nlevel; - - /* Get and convert the value */ - /* No locking on bl_curve since accessing a single value */ - nlevel = MIN_LEVEL + info->bl_curve[level] * LEVEL_STEP; - - if (nlevel < 0) - nlevel = 0; - else if (nlevel < MIN_LEVEL) - nlevel = MIN_LEVEL; - else if (nlevel > MAX_LEVEL) - nlevel = MAX_LEVEL; - - return nlevel; -} - -static int riva_bl_update_status(struct backlight_device *bd) -{ - struct riva_par *par = bl_get_data(bd); - U032 tmp_pcrt, tmp_pmc; - int level; - - if (bd->props.power != FB_BLANK_UNBLANK || - bd->props.fb_blank != FB_BLANK_UNBLANK) - level = 0; - else - level = bd->props.brightness; - - tmp_pmc = NV_RD32(par->riva.PMC, 0x10F0) & 0x0000FFFF; - tmp_pcrt = NV_RD32(par->riva.PCRTC0, 0x081C) & 0xFFFFFFFC; - if(level > 0) { - tmp_pcrt |= 0x1; - tmp_pmc |= (1 << 31); /* backlight bit */ - tmp_pmc |= riva_bl_get_level_brightness(par, level) << 16; /* level */ - } - NV_WR32(par->riva.PCRTC0, 0x081C, tmp_pcrt); - NV_WR32(par->riva.PMC, 0x10F0, tmp_pmc); - - return 0; -} - -static const struct backlight_ops riva_bl_ops = { - .update_status = riva_bl_update_status, -}; - -static void riva_bl_init(struct riva_par *par) -{ - struct backlight_properties props; - struct fb_info *info = pci_get_drvdata(par->pdev); - struct backlight_device *bd; - char name[12]; - - if (!par->FlatPanel) - return; - -#ifdef CONFIG_PMAC_BACKLIGHT - if (!machine_is(powermac) || - !pmac_has_backlight_type("mnca")) - return; -#endif - - snprintf(name, sizeof(name), "rivabl%d", info->node); - - memset(&props, 0, sizeof(struct backlight_properties)); - props.type = BACKLIGHT_RAW; - props.max_brightness = FB_BACKLIGHT_LEVELS - 1; - bd = backlight_device_register(name, info->dev, par, &riva_bl_ops, - &props); - if (IS_ERR(bd)) { - info->bl_dev = NULL; - printk(KERN_WARNING "riva: Backlight registration failed\n"); - goto error; - } - - info->bl_dev = bd; - fb_bl_default_curve(info, 0, - MIN_LEVEL * FB_BACKLIGHT_MAX / MAX_LEVEL, - FB_BACKLIGHT_MAX); - - bd->props.brightness = bd->props.max_brightness; - bd->props.power = FB_BLANK_UNBLANK; - backlight_update_status(bd); - - printk("riva: Backlight initialized (%s)\n", name); - - return; - -error: - return; -} - -static void riva_bl_exit(struct fb_info *info) -{ - struct backlight_device *bd = info->bl_dev; - - backlight_device_unregister(bd); - printk("riva: Backlight unloaded\n"); -} -#else -static inline void riva_bl_init(struct riva_par *par) {} -static inline void riva_bl_exit(struct fb_info *info) {} -#endif /* CONFIG_FB_RIVA_BACKLIGHT */ - -/* ------------------------------------------------------------------------- * - * - * MMIO access macros - * - * ------------------------------------------------------------------------- */ - -static inline void CRTCout(struct riva_par *par, unsigned char index, - unsigned char val) -{ - VGA_WR08(par->riva.PCIO, 0x3d4, index); - VGA_WR08(par->riva.PCIO, 0x3d5, val); -} - -static inline unsigned char CRTCin(struct riva_par *par, - unsigned char index) -{ - VGA_WR08(par->riva.PCIO, 0x3d4, index); - return (VGA_RD08(par->riva.PCIO, 0x3d5)); -} - -static inline void GRAout(struct riva_par *par, unsigned char index, - unsigned char val) -{ - VGA_WR08(par->riva.PVIO, 0x3ce, index); - VGA_WR08(par->riva.PVIO, 0x3cf, val); -} - -static inline unsigned char GRAin(struct riva_par *par, - unsigned char index) -{ - VGA_WR08(par->riva.PVIO, 0x3ce, index); - return (VGA_RD08(par->riva.PVIO, 0x3cf)); -} - -static inline void SEQout(struct riva_par *par, unsigned char index, - unsigned char val) -{ - VGA_WR08(par->riva.PVIO, 0x3c4, index); - VGA_WR08(par->riva.PVIO, 0x3c5, val); -} - -static inline unsigned char SEQin(struct riva_par *par, - unsigned char index) -{ - VGA_WR08(par->riva.PVIO, 0x3c4, index); - return (VGA_RD08(par->riva.PVIO, 0x3c5)); -} - -static inline void ATTRout(struct riva_par *par, unsigned char index, - unsigned char val) -{ - VGA_WR08(par->riva.PCIO, 0x3c0, index); - VGA_WR08(par->riva.PCIO, 0x3c0, val); -} - -static inline unsigned char ATTRin(struct riva_par *par, - unsigned char index) -{ - VGA_WR08(par->riva.PCIO, 0x3c0, index); - return (VGA_RD08(par->riva.PCIO, 0x3c1)); -} - -static inline void MISCout(struct riva_par *par, unsigned char val) -{ - VGA_WR08(par->riva.PVIO, 0x3c2, val); -} - -static inline unsigned char MISCin(struct riva_par *par) -{ - return (VGA_RD08(par->riva.PVIO, 0x3cc)); -} - -static inline void reverse_order(u32 *l) -{ - u8 *a = (u8 *)l; - a[0] = bitrev8(a[0]); - a[1] = bitrev8(a[1]); - a[2] = bitrev8(a[2]); - a[3] = bitrev8(a[3]); -} - -/* ------------------------------------------------------------------------- * - * - * cursor stuff - * - * ------------------------------------------------------------------------- */ - -/** - * rivafb_load_cursor_image - load cursor image to hardware - * @data: address to monochrome bitmap (1 = foreground color, 0 = background) - * @par: pointer to private data - * @w: width of cursor image in pixels - * @h: height of cursor image in scanlines - * @bg: background color (ARGB1555) - alpha bit determines opacity - * @fg: foreground color (ARGB1555) - * - * DESCRIPTiON: - * Loads cursor image based on a monochrome source and mask bitmap. The - * image bits determines the color of the pixel, 0 for background, 1 for - * foreground. Only the affected region (as determined by @w and @h - * parameters) will be updated. - * - * CALLED FROM: - * rivafb_cursor() - */ -static void rivafb_load_cursor_image(struct riva_par *par, u8 *data8, - u16 bg, u16 fg, u32 w, u32 h) -{ - int i, j, k = 0; - u32 b, tmp; - u32 *data = (u32 *)data8; - bg = le16_to_cpu(bg); - fg = le16_to_cpu(fg); - - w = (w + 1) & ~1; - - for (i = 0; i < h; i++) { - b = *data++; - reverse_order(&b); - - for (j = 0; j < w/2; j++) { - tmp = 0; -#if defined (__BIG_ENDIAN) - tmp = (b & (1 << 31)) ? fg << 16 : bg << 16; - b <<= 1; - tmp |= (b & (1 << 31)) ? fg : bg; - b <<= 1; -#else - tmp = (b & 1) ? fg : bg; - b >>= 1; - tmp |= (b & 1) ? fg << 16 : bg << 16; - b >>= 1; -#endif - writel(tmp, &par->riva.CURSOR[k++]); - } - k += (MAX_CURS - w)/2; - } -} - -/* ------------------------------------------------------------------------- * - * - * general utility functions - * - * ------------------------------------------------------------------------- */ - -/** - * riva_wclut - set CLUT entry - * @chip: pointer to RIVA_HW_INST object - * @regnum: register number - * @red: red component - * @green: green component - * @blue: blue component - * - * DESCRIPTION: - * Sets color register @regnum. - * - * CALLED FROM: - * rivafb_setcolreg() - */ -static void riva_wclut(RIVA_HW_INST *chip, - unsigned char regnum, unsigned char red, - unsigned char green, unsigned char blue) -{ - VGA_WR08(chip->PDIO, 0x3c8, regnum); - VGA_WR08(chip->PDIO, 0x3c9, red); - VGA_WR08(chip->PDIO, 0x3c9, green); - VGA_WR08(chip->PDIO, 0x3c9, blue); -} - -/** - * riva_rclut - read fromCLUT register - * @chip: pointer to RIVA_HW_INST object - * @regnum: register number - * @red: red component - * @green: green component - * @blue: blue component - * - * DESCRIPTION: - * Reads red, green, and blue from color register @regnum. - * - * CALLED FROM: - * rivafb_setcolreg() - */ -static void riva_rclut(RIVA_HW_INST *chip, - unsigned char regnum, unsigned char *red, - unsigned char *green, unsigned char *blue) -{ - - VGA_WR08(chip->PDIO, 0x3c7, regnum); - *red = VGA_RD08(chip->PDIO, 0x3c9); - *green = VGA_RD08(chip->PDIO, 0x3c9); - *blue = VGA_RD08(chip->PDIO, 0x3c9); -} - -/** - * riva_save_state - saves current chip state - * @par: pointer to riva_par object containing info for current riva board - * @regs: pointer to riva_regs object - * - * DESCRIPTION: - * Saves current chip state to @regs. - * - * CALLED FROM: - * rivafb_probe() - */ -/* from GGI */ -static void riva_save_state(struct riva_par *par, struct riva_regs *regs) -{ - int i; - - NVTRACE_ENTER(); - par->riva.LockUnlock(&par->riva, 0); - - par->riva.UnloadStateExt(&par->riva, ®s->ext); - - regs->misc_output = MISCin(par); - - for (i = 0; i < NUM_CRT_REGS; i++) - regs->crtc[i] = CRTCin(par, i); - - for (i = 0; i < NUM_ATC_REGS; i++) - regs->attr[i] = ATTRin(par, i); - - for (i = 0; i < NUM_GRC_REGS; i++) - regs->gra[i] = GRAin(par, i); - - for (i = 0; i < NUM_SEQ_REGS; i++) - regs->seq[i] = SEQin(par, i); - NVTRACE_LEAVE(); -} - -/** - * riva_load_state - loads current chip state - * @par: pointer to riva_par object containing info for current riva board - * @regs: pointer to riva_regs object - * - * DESCRIPTION: - * Loads chip state from @regs. - * - * CALLED FROM: - * riva_load_video_mode() - * rivafb_probe() - * rivafb_remove() - */ -/* from GGI */ -static void riva_load_state(struct riva_par *par, struct riva_regs *regs) -{ - RIVA_HW_STATE *state = ®s->ext; - int i; - - NVTRACE_ENTER(); - CRTCout(par, 0x11, 0x00); - - par->riva.LockUnlock(&par->riva, 0); - - par->riva.LoadStateExt(&par->riva, state); - - MISCout(par, regs->misc_output); - - for (i = 0; i < NUM_CRT_REGS; i++) { - switch (i) { - case 0x19: - case 0x20 ... 0x40: - break; - default: - CRTCout(par, i, regs->crtc[i]); - } - } - - for (i = 0; i < NUM_ATC_REGS; i++) - ATTRout(par, i, regs->attr[i]); - - for (i = 0; i < NUM_GRC_REGS; i++) - GRAout(par, i, regs->gra[i]); - - for (i = 0; i < NUM_SEQ_REGS; i++) - SEQout(par, i, regs->seq[i]); - NVTRACE_LEAVE(); -} - -/** - * riva_load_video_mode - calculate timings - * @info: pointer to fb_info object containing info for current riva board - * - * DESCRIPTION: - * Calculate some timings and then send em off to riva_load_state(). - * - * CALLED FROM: - * rivafb_set_par() - */ -static int riva_load_video_mode(struct fb_info *info) -{ - int bpp, width, hDisplaySize, hDisplay, hStart, - hEnd, hTotal, height, vDisplay, vStart, vEnd, vTotal, dotClock; - int hBlankStart, hBlankEnd, vBlankStart, vBlankEnd; - int rc; - struct riva_par *par = info->par; - struct riva_regs newmode; - - NVTRACE_ENTER(); - /* time to calculate */ - rivafb_blank(FB_BLANK_NORMAL, info); - - bpp = info->var.bits_per_pixel; - if (bpp == 16 && info->var.green.length == 5) - bpp = 15; - width = info->var.xres_virtual; - hDisplaySize = info->var.xres; - hDisplay = (hDisplaySize / 8) - 1; - hStart = (hDisplaySize + info->var.right_margin) / 8 - 1; - hEnd = (hDisplaySize + info->var.right_margin + - info->var.hsync_len) / 8 - 1; - hTotal = (hDisplaySize + info->var.right_margin + - info->var.hsync_len + info->var.left_margin) / 8 - 5; - hBlankStart = hDisplay; - hBlankEnd = hTotal + 4; - - height = info->var.yres_virtual; - vDisplay = info->var.yres - 1; - vStart = info->var.yres + info->var.lower_margin - 1; - vEnd = info->var.yres + info->var.lower_margin + - info->var.vsync_len - 1; - vTotal = info->var.yres + info->var.lower_margin + - info->var.vsync_len + info->var.upper_margin + 2; - vBlankStart = vDisplay; - vBlankEnd = vTotal + 1; - dotClock = 1000000000 / info->var.pixclock; - - memcpy(&newmode, ®_template, sizeof(struct riva_regs)); - - if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) - vTotal |= 1; - - if (par->FlatPanel) { - vStart = vTotal - 3; - vEnd = vTotal - 2; - vBlankStart = vStart; - hStart = hTotal - 3; - hEnd = hTotal - 2; - hBlankEnd = hTotal + 4; - } - - newmode.crtc[0x0] = Set8Bits (hTotal); - newmode.crtc[0x1] = Set8Bits (hDisplay); - newmode.crtc[0x2] = Set8Bits (hBlankStart); - newmode.crtc[0x3] = SetBitField (hBlankEnd, 4: 0, 4:0) | SetBit (7); - newmode.crtc[0x4] = Set8Bits (hStart); - newmode.crtc[0x5] = SetBitField (hBlankEnd, 5: 5, 7:7) - | SetBitField (hEnd, 4: 0, 4:0); - newmode.crtc[0x6] = SetBitField (vTotal, 7: 0, 7:0); - newmode.crtc[0x7] = SetBitField (vTotal, 8: 8, 0:0) - | SetBitField (vDisplay, 8: 8, 1:1) - | SetBitField (vStart, 8: 8, 2:2) - | SetBitField (vBlankStart, 8: 8, 3:3) - | SetBit (4) - | SetBitField (vTotal, 9: 9, 5:5) - | SetBitField (vDisplay, 9: 9, 6:6) - | SetBitField (vStart, 9: 9, 7:7); - newmode.crtc[0x9] = SetBitField (vBlankStart, 9: 9, 5:5) - | SetBit (6); - newmode.crtc[0x10] = Set8Bits (vStart); - newmode.crtc[0x11] = SetBitField (vEnd, 3: 0, 3:0) - | SetBit (5); - newmode.crtc[0x12] = Set8Bits (vDisplay); - newmode.crtc[0x13] = (width / 8) * ((bpp + 1) / 8); - newmode.crtc[0x15] = Set8Bits (vBlankStart); - newmode.crtc[0x16] = Set8Bits (vBlankEnd); - - newmode.ext.screen = SetBitField(hBlankEnd,6:6,4:4) - | SetBitField(vBlankStart,10:10,3:3) - | SetBitField(vStart,10:10,2:2) - | SetBitField(vDisplay,10:10,1:1) - | SetBitField(vTotal,10:10,0:0); - newmode.ext.horiz = SetBitField(hTotal,8:8,0:0) - | SetBitField(hDisplay,8:8,1:1) - | SetBitField(hBlankStart,8:8,2:2) - | SetBitField(hStart,8:8,3:3); - newmode.ext.extra = SetBitField(vTotal,11:11,0:0) - | SetBitField(vDisplay,11:11,2:2) - | SetBitField(vStart,11:11,4:4) - | SetBitField(vBlankStart,11:11,6:6); - - if ((info->var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) { - int tmp = (hTotal >> 1) & ~1; - newmode.ext.interlace = Set8Bits(tmp); - newmode.ext.horiz |= SetBitField(tmp, 8:8,4:4); - } else - newmode.ext.interlace = 0xff; /* interlace off */ - - if (par->riva.Architecture >= NV_ARCH_10) - par->riva.CURSOR = (U032 __iomem *)(info->screen_base + par->riva.CursorStart); - - if (info->var.sync & FB_SYNC_HOR_HIGH_ACT) - newmode.misc_output &= ~0x40; - else - newmode.misc_output |= 0x40; - if (info->var.sync & FB_SYNC_VERT_HIGH_ACT) - newmode.misc_output &= ~0x80; - else - newmode.misc_output |= 0x80; - - rc = CalcStateExt(&par->riva, &newmode.ext, par->pdev, bpp, width, - hDisplaySize, height, dotClock); - if (rc) - goto out; - - newmode.ext.scale = NV_RD32(par->riva.PRAMDAC, 0x00000848) & - 0xfff000ff; - if (par->FlatPanel == 1) { - newmode.ext.pixel |= (1 << 7); - newmode.ext.scale |= (1 << 8); - } - if (par->SecondCRTC) { - newmode.ext.head = NV_RD32(par->riva.PCRTC0, 0x00000860) & - ~0x00001000; - newmode.ext.head2 = NV_RD32(par->riva.PCRTC0, 0x00002860) | - 0x00001000; - newmode.ext.crtcOwner = 3; - newmode.ext.pllsel |= 0x20000800; - newmode.ext.vpll2 = newmode.ext.vpll; - } else if (par->riva.twoHeads) { - newmode.ext.head = NV_RD32(par->riva.PCRTC0, 0x00000860) | - 0x00001000; - newmode.ext.head2 = NV_RD32(par->riva.PCRTC0, 0x00002860) & - ~0x00001000; - newmode.ext.crtcOwner = 0; - newmode.ext.vpll2 = NV_RD32(par->riva.PRAMDAC0, 0x00000520); - } - if (par->FlatPanel == 1) { - newmode.ext.pixel |= (1 << 7); - newmode.ext.scale |= (1 << 8); - } - newmode.ext.cursorConfig = 0x02000100; - par->current_state = newmode; - riva_load_state(par, &par->current_state); - par->riva.LockUnlock(&par->riva, 0); /* important for HW cursor */ - -out: - rivafb_blank(FB_BLANK_UNBLANK, info); - NVTRACE_LEAVE(); - - return rc; -} - -static void riva_update_var(struct fb_var_screeninfo *var, - const struct fb_videomode *modedb) -{ - NVTRACE_ENTER(); - var->xres = var->xres_virtual = modedb->xres; - var->yres = modedb->yres; - if (var->yres_virtual < var->yres) - var->yres_virtual = var->yres; - var->xoffset = var->yoffset = 0; - var->pixclock = modedb->pixclock; - var->left_margin = modedb->left_margin; - var->right_margin = modedb->right_margin; - var->upper_margin = modedb->upper_margin; - var->lower_margin = modedb->lower_margin; - var->hsync_len = modedb->hsync_len; - var->vsync_len = modedb->vsync_len; - var->sync = modedb->sync; - var->vmode = modedb->vmode; - NVTRACE_LEAVE(); -} - -/** - * rivafb_do_maximize - - * @info: pointer to fb_info object containing info for current riva board - * @var: - * @nom: - * @den: - * - * DESCRIPTION: - * . - * - * RETURNS: - * -EINVAL on failure, 0 on success - * - * - * CALLED FROM: - * rivafb_check_var() - */ -static int rivafb_do_maximize(struct fb_info *info, - struct fb_var_screeninfo *var, - int nom, int den) -{ - static struct { - int xres, yres; - } modes[] = { - {1600, 1280}, - {1280, 1024}, - {1024, 768}, - {800, 600}, - {640, 480}, - {-1, -1} - }; - int i; - - NVTRACE_ENTER(); - /* use highest possible virtual resolution */ - if (var->xres_virtual == -1 && var->yres_virtual == -1) { - printk(KERN_WARNING PFX - "using maximum available virtual resolution\n"); - for (i = 0; modes[i].xres != -1; i++) { - if (modes[i].xres * nom / den * modes[i].yres < - info->fix.smem_len) - break; - } - if (modes[i].xres == -1) { - printk(KERN_ERR PFX - "could not find a virtual resolution that fits into video memory!!\n"); - NVTRACE("EXIT - EINVAL error\n"); - return -EINVAL; - } - var->xres_virtual = modes[i].xres; - var->yres_virtual = modes[i].yres; - - printk(KERN_INFO PFX - "virtual resolution set to maximum of %dx%d\n", - var->xres_virtual, var->yres_virtual); - } else if (var->xres_virtual == -1) { - var->xres_virtual = (info->fix.smem_len * den / - (nom * var->yres_virtual)) & ~15; - printk(KERN_WARNING PFX - "setting virtual X resolution to %d\n", var->xres_virtual); - } else if (var->yres_virtual == -1) { - var->xres_virtual = (var->xres_virtual + 15) & ~15; - var->yres_virtual = info->fix.smem_len * den / - (nom * var->xres_virtual); - printk(KERN_WARNING PFX - "setting virtual Y resolution to %d\n", var->yres_virtual); - } else { - var->xres_virtual = (var->xres_virtual + 15) & ~15; - if (var->xres_virtual * nom / den * var->yres_virtual > info->fix.smem_len) { - printk(KERN_ERR PFX - "mode %dx%dx%d rejected...resolution too high to fit into video memory!\n", - var->xres, var->yres, var->bits_per_pixel); - NVTRACE("EXIT - EINVAL error\n"); - return -EINVAL; - } - } - - if (var->xres_virtual * nom / den >= 8192) { - printk(KERN_WARNING PFX - "virtual X resolution (%d) is too high, lowering to %d\n", - var->xres_virtual, 8192 * den / nom - 16); - var->xres_virtual = 8192 * den / nom - 16; - } - - if (var->xres_virtual < var->xres) { - printk(KERN_ERR PFX - "virtual X resolution (%d) is smaller than real\n", var->xres_virtual); - return -EINVAL; - } - - if (var->yres_virtual < var->yres) { - printk(KERN_ERR PFX - "virtual Y resolution (%d) is smaller than real\n", var->yres_virtual); - return -EINVAL; - } - if (var->yres_virtual > 0x7fff/nom) - var->yres_virtual = 0x7fff/nom; - if (var->xres_virtual > 0x7fff/nom) - var->xres_virtual = 0x7fff/nom; - NVTRACE_LEAVE(); - return 0; -} - -static void -riva_set_pattern(struct riva_par *par, int clr0, int clr1, int pat0, int pat1) -{ - RIVA_FIFO_FREE(par->riva, Patt, 4); - NV_WR32(&par->riva.Patt->Color0, 0, clr0); - NV_WR32(&par->riva.Patt->Color1, 0, clr1); - NV_WR32(par->riva.Patt->Monochrome, 0, pat0); - NV_WR32(par->riva.Patt->Monochrome, 4, pat1); -} - -/* acceleration routines */ -static inline void wait_for_idle(struct riva_par *par) -{ - while (par->riva.Busy(&par->riva)); -} - -/* - * Set ROP. Translate X rop into ROP3. Internal routine. - */ -static void -riva_set_rop_solid(struct riva_par *par, int rop) -{ - riva_set_pattern(par, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); - RIVA_FIFO_FREE(par->riva, Rop, 1); - NV_WR32(&par->riva.Rop->Rop3, 0, rop); - -} - -static void riva_setup_accel(struct fb_info *info) -{ - struct riva_par *par = info->par; - - RIVA_FIFO_FREE(par->riva, Clip, 2); - NV_WR32(&par->riva.Clip->TopLeft, 0, 0x0); - NV_WR32(&par->riva.Clip->WidthHeight, 0, - (info->var.xres_virtual & 0xffff) | - (info->var.yres_virtual << 16)); - riva_set_rop_solid(par, 0xcc); - wait_for_idle(par); -} - -/** - * riva_get_cmap_len - query current color map length - * @var: standard kernel fb changeable data - * - * DESCRIPTION: - * Get current color map length. - * - * RETURNS: - * Length of color map - * - * CALLED FROM: - * rivafb_setcolreg() - */ -static int riva_get_cmap_len(const struct fb_var_screeninfo *var) -{ - int rc = 256; /* reasonable default */ - - switch (var->green.length) { - case 8: - rc = 256; /* 256 entries (2^8), 8 bpp and RGB8888 */ - break; - case 5: - rc = 32; /* 32 entries (2^5), 16 bpp, RGB555 */ - break; - case 6: - rc = 64; /* 64 entries (2^6), 16 bpp, RGB565 */ - break; - default: - /* should not occur */ - break; - } - return rc; -} - -/* ------------------------------------------------------------------------- * - * - * framebuffer operations - * - * ------------------------------------------------------------------------- */ - -static int rivafb_open(struct fb_info *info, int user) -{ - struct riva_par *par = info->par; - - NVTRACE_ENTER(); - mutex_lock(&par->open_lock); - if (!par->ref_count) { -#ifdef CONFIG_X86 - memset(&par->state, 0, sizeof(struct vgastate)); - par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS; - /* save the DAC for Riva128 */ - if (par->riva.Architecture == NV_ARCH_03) - par->state.flags |= VGA_SAVE_CMAP; - save_vga(&par->state); -#endif - /* vgaHWunlock() + riva unlock (0x7F) */ - CRTCout(par, 0x11, 0xFF); - par->riva.LockUnlock(&par->riva, 0); - - riva_save_state(par, &par->initial_state); - } - par->ref_count++; - mutex_unlock(&par->open_lock); - NVTRACE_LEAVE(); - return 0; -} - -static int rivafb_release(struct fb_info *info, int user) -{ - struct riva_par *par = info->par; - - NVTRACE_ENTER(); - mutex_lock(&par->open_lock); - if (!par->ref_count) { - mutex_unlock(&par->open_lock); - return -EINVAL; - } - if (par->ref_count == 1) { - par->riva.LockUnlock(&par->riva, 0); - par->riva.LoadStateExt(&par->riva, &par->initial_state.ext); - riva_load_state(par, &par->initial_state); -#ifdef CONFIG_X86 - restore_vga(&par->state); -#endif - par->riva.LockUnlock(&par->riva, 1); - } - par->ref_count--; - mutex_unlock(&par->open_lock); - NVTRACE_LEAVE(); - return 0; -} - -static int rivafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) -{ - const struct fb_videomode *mode; - struct riva_par *par = info->par; - int nom, den; /* translating from pixels->bytes */ - int mode_valid = 0; - - NVTRACE_ENTER(); - if (!var->pixclock) - return -EINVAL; - - switch (var->bits_per_pixel) { - case 1 ... 8: - var->red.offset = var->green.offset = var->blue.offset = 0; - var->red.length = var->green.length = var->blue.length = 8; - var->bits_per_pixel = 8; - nom = den = 1; - break; - case 9 ... 15: - var->green.length = 5; - fallthrough; - case 16: - var->bits_per_pixel = 16; - /* The Riva128 supports RGB555 only */ - if (par->riva.Architecture == NV_ARCH_03) - var->green.length = 5; - if (var->green.length == 5) { - /* 0rrrrrgg gggbbbbb */ - var->red.offset = 10; - var->green.offset = 5; - var->blue.offset = 0; - var->red.length = 5; - var->green.length = 5; - var->blue.length = 5; - } else { - /* rrrrrggg gggbbbbb */ - var->red.offset = 11; - var->green.offset = 5; - var->blue.offset = 0; - var->red.length = 5; - var->green.length = 6; - var->blue.length = 5; - } - nom = 2; - den = 1; - break; - case 17 ... 32: - var->red.length = var->green.length = var->blue.length = 8; - var->bits_per_pixel = 32; - var->red.offset = 16; - var->green.offset = 8; - var->blue.offset = 0; - nom = 4; - den = 1; - break; - default: - printk(KERN_ERR PFX - "mode %dx%dx%d rejected...color depth not supported.\n", - var->xres, var->yres, var->bits_per_pixel); - NVTRACE("EXIT, returning -EINVAL\n"); - return -EINVAL; - } - - if (!strictmode) { - if (!info->monspecs.vfmax || !info->monspecs.hfmax || - !info->monspecs.dclkmax || !fb_validate_mode(var, info)) - mode_valid = 1; - } - - /* calculate modeline if supported by monitor */ - if (!mode_valid && info->monspecs.gtf) { - if (!fb_get_mode(FB_MAXTIMINGS, 0, var, info)) - mode_valid = 1; - } - - if (!mode_valid) { - mode = fb_find_best_mode(var, &info->modelist); - if (mode) { - riva_update_var(var, mode); - mode_valid = 1; - } - } - - if (!mode_valid && info->monspecs.modedb_len) - return -EINVAL; - - if (var->xres_virtual < var->xres) - var->xres_virtual = var->xres; - if (var->yres_virtual <= var->yres) - var->yres_virtual = -1; - if (rivafb_do_maximize(info, var, nom, den) < 0) - return -EINVAL; - - /* truncate xoffset and yoffset to maximum if too high */ - if (var->xoffset > var->xres_virtual - var->xres) - var->xoffset = var->xres_virtual - var->xres - 1; - - if (var->yoffset > var->yres_virtual - var->yres) - var->yoffset = var->yres_virtual - var->yres - 1; - - var->red.msb_right = - var->green.msb_right = - var->blue.msb_right = - var->transp.offset = var->transp.length = var->transp.msb_right = 0; - NVTRACE_LEAVE(); - return 0; -} - -static int rivafb_set_par(struct fb_info *info) -{ - struct riva_par *par = info->par; - int rc = 0; - - NVTRACE_ENTER(); - /* vgaHWunlock() + riva unlock (0x7F) */ - CRTCout(par, 0x11, 0xFF); - par->riva.LockUnlock(&par->riva, 0); - rc = riva_load_video_mode(info); - if (rc) - goto out; - if(!(info->flags & FBINFO_HWACCEL_DISABLED)) - riva_setup_accel(info); - - par->cursor_reset = 1; - info->fix.line_length = (info->var.xres_virtual * (info->var.bits_per_pixel >> 3)); - info->fix.visual = (info->var.bits_per_pixel == 8) ? - FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR; - - if (info->flags & FBINFO_HWACCEL_DISABLED) - info->pixmap.scan_align = 1; - else - info->pixmap.scan_align = 4; - -out: - NVTRACE_LEAVE(); - return rc; -} - -/** - * rivafb_pan_display - * @var: standard kernel fb changeable data - * @con: TODO - * @info: pointer to fb_info object containing info for current riva board - * - * DESCRIPTION: - * Pan (or wrap, depending on the `vmode' field) the display using the - * `xoffset' and `yoffset' fields of the `var' structure. - * If the values don't fit, return -EINVAL. - * - * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag - */ -static int rivafb_pan_display(struct fb_var_screeninfo *var, - struct fb_info *info) -{ - struct riva_par *par = info->par; - unsigned int base; - - NVTRACE_ENTER(); - base = var->yoffset * info->fix.line_length + var->xoffset; - par->riva.SetStartAddress(&par->riva, base); - NVTRACE_LEAVE(); - return 0; -} - -static int rivafb_blank(int blank, struct fb_info *info) -{ - struct riva_par *par= info->par; - unsigned char tmp, vesa; - - tmp = SEQin(par, 0x01) & ~0x20; /* screen on/off */ - vesa = CRTCin(par, 0x1a) & ~0xc0; /* sync on/off */ - - NVTRACE_ENTER(); - - if (blank) - tmp |= 0x20; - - switch (blank) { - case FB_BLANK_UNBLANK: - case FB_BLANK_NORMAL: - break; - case FB_BLANK_VSYNC_SUSPEND: - vesa |= 0x80; - break; - case FB_BLANK_HSYNC_SUSPEND: - vesa |= 0x40; - break; - case FB_BLANK_POWERDOWN: - vesa |= 0xc0; - break; - } - - SEQout(par, 0x01, tmp); - CRTCout(par, 0x1a, vesa); - - NVTRACE_LEAVE(); - - return 0; -} - -/** - * rivafb_setcolreg - * @regno: register index - * @red: red component - * @green: green component - * @blue: blue component - * @transp: transparency - * @info: pointer to fb_info object containing info for current riva board - * - * DESCRIPTION: - * Set a single color register. The values supplied have a 16 bit - * magnitude. - * - * RETURNS: - * Return != 0 for invalid regno. - * - * CALLED FROM: - * fbcmap.c:fb_set_cmap() - */ -static int rivafb_setcolreg(unsigned regno, unsigned red, unsigned green, - unsigned blue, unsigned transp, - struct fb_info *info) -{ - struct riva_par *par = info->par; - RIVA_HW_INST *chip = &par->riva; - int i; - - if (regno >= riva_get_cmap_len(&info->var)) - return -EINVAL; - - if (info->var.grayscale) { - /* gray = 0.30*R + 0.59*G + 0.11*B */ - red = green = blue = - (red * 77 + green * 151 + blue * 28) >> 8; - } - - if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) { - ((u32 *) info->pseudo_palette)[regno] = - (regno << info->var.red.offset) | - (regno << info->var.green.offset) | - (regno << info->var.blue.offset); - /* - * The Riva128 2D engine requires color information in - * TrueColor format even if framebuffer is in DirectColor - */ - if (par->riva.Architecture == NV_ARCH_03) { - switch (info->var.bits_per_pixel) { - case 16: - par->palette[regno] = ((red & 0xf800) >> 1) | - ((green & 0xf800) >> 6) | - ((blue & 0xf800) >> 11); - break; - case 32: - par->palette[regno] = ((red & 0xff00) << 8) | - ((green & 0xff00)) | - ((blue & 0xff00) >> 8); - break; - } - } - } - - switch (info->var.bits_per_pixel) { - case 8: - /* "transparent" stuff is completely ignored. */ - riva_wclut(chip, regno, red >> 8, green >> 8, blue >> 8); - break; - case 16: - if (info->var.green.length == 5) { - for (i = 0; i < 8; i++) { - riva_wclut(chip, regno*8+i, red >> 8, - green >> 8, blue >> 8); - } - } else { - u8 r, g, b; - - if (regno < 32) { - for (i = 0; i < 8; i++) { - riva_wclut(chip, regno*8+i, - red >> 8, green >> 8, - blue >> 8); - } - } - riva_rclut(chip, regno*4, &r, &g, &b); - for (i = 0; i < 4; i++) - riva_wclut(chip, regno*4+i, r, - green >> 8, b); - } - break; - case 32: - riva_wclut(chip, regno, red >> 8, green >> 8, blue >> 8); - break; - default: - /* do nothing */ - break; - } - return 0; -} - -/** - * rivafb_fillrect - hardware accelerated color fill function - * @info: pointer to fb_info structure - * @rect: pointer to fb_fillrect structure - * - * DESCRIPTION: - * This function fills up a region of framebuffer memory with a solid - * color with a choice of two different ROP's, copy or invert. - * - * CALLED FROM: - * framebuffer hook - */ -static void rivafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) -{ - struct riva_par *par = info->par; - u_int color, rop = 0; - - if ((info->flags & FBINFO_HWACCEL_DISABLED)) { - cfb_fillrect(info, rect); - return; - } - - if (info->var.bits_per_pixel == 8) - color = rect->color; - else { - if (par->riva.Architecture != NV_ARCH_03) - color = ((u32 *)info->pseudo_palette)[rect->color]; - else - color = par->palette[rect->color]; - } - - switch (rect->rop) { - case ROP_XOR: - rop = 0x66; - break; - case ROP_COPY: - default: - rop = 0xCC; - break; - } - - riva_set_rop_solid(par, rop); - - RIVA_FIFO_FREE(par->riva, Bitmap, 1); - NV_WR32(&par->riva.Bitmap->Color1A, 0, color); - - RIVA_FIFO_FREE(par->riva, Bitmap, 2); - NV_WR32(&par->riva.Bitmap->UnclippedRectangle[0].TopLeft, 0, - (rect->dx << 16) | rect->dy); - mb(); - NV_WR32(&par->riva.Bitmap->UnclippedRectangle[0].WidthHeight, 0, - (rect->width << 16) | rect->height); - mb(); - riva_set_rop_solid(par, 0xcc); - -} - -/** - * rivafb_copyarea - hardware accelerated blit function - * @info: pointer to fb_info structure - * @region: pointer to fb_copyarea structure - * - * DESCRIPTION: - * This copies an area of pixels from one location to another - * - * CALLED FROM: - * framebuffer hook - */ -static void rivafb_copyarea(struct fb_info *info, const struct fb_copyarea *region) -{ - struct riva_par *par = info->par; - - if ((info->flags & FBINFO_HWACCEL_DISABLED)) { - cfb_copyarea(info, region); - return; - } - - RIVA_FIFO_FREE(par->riva, Blt, 3); - NV_WR32(&par->riva.Blt->TopLeftSrc, 0, - (region->sy << 16) | region->sx); - NV_WR32(&par->riva.Blt->TopLeftDst, 0, - (region->dy << 16) | region->dx); - mb(); - NV_WR32(&par->riva.Blt->WidthHeight, 0, - (region->height << 16) | region->width); - mb(); -} - -static inline void convert_bgcolor_16(u32 *col) -{ - *col = ((*col & 0x0000F800) << 8) - | ((*col & 0x00007E0) << 5) - | ((*col & 0x0000001F) << 3) - | 0xFF000000; - mb(); -} - -/** - * rivafb_imageblit: hardware accelerated color expand function - * @info: pointer to fb_info structure - * @image: pointer to fb_image structure - * - * DESCRIPTION: - * If the source is a monochrome bitmap, the function fills up a a region - * of framebuffer memory with pixels whose color is determined by the bit - * setting of the bitmap, 1 - foreground, 0 - background. - * - * If the source is not a monochrome bitmap, color expansion is not done. - * In this case, it is channeled to a software function. - * - * CALLED FROM: - * framebuffer hook - */ -static void rivafb_imageblit(struct fb_info *info, - const struct fb_image *image) -{ - struct riva_par *par = info->par; - u32 fgx = 0, bgx = 0, width, tmp; - u8 *cdat = (u8 *) image->data; - volatile u32 __iomem *d; - int i, size; - - if ((info->flags & FBINFO_HWACCEL_DISABLED) || image->depth != 1) { - cfb_imageblit(info, image); - return; - } - - switch (info->var.bits_per_pixel) { - case 8: - fgx = image->fg_color; - bgx = image->bg_color; - break; - case 16: - case 32: - if (par->riva.Architecture != NV_ARCH_03) { - fgx = ((u32 *)info->pseudo_palette)[image->fg_color]; - bgx = ((u32 *)info->pseudo_palette)[image->bg_color]; - } else { - fgx = par->palette[image->fg_color]; - bgx = par->palette[image->bg_color]; - } - if (info->var.green.length == 6) - convert_bgcolor_16(&bgx); - break; - } - - RIVA_FIFO_FREE(par->riva, Bitmap, 7); - NV_WR32(&par->riva.Bitmap->ClipE.TopLeft, 0, - (image->dy << 16) | (image->dx & 0xFFFF)); - NV_WR32(&par->riva.Bitmap->ClipE.BottomRight, 0, - (((image->dy + image->height) << 16) | - ((image->dx + image->width) & 0xffff))); - NV_WR32(&par->riva.Bitmap->Color0E, 0, bgx); - NV_WR32(&par->riva.Bitmap->Color1E, 0, fgx); - NV_WR32(&par->riva.Bitmap->WidthHeightInE, 0, - (image->height << 16) | ((image->width + 31) & ~31)); - NV_WR32(&par->riva.Bitmap->WidthHeightOutE, 0, - (image->height << 16) | ((image->width + 31) & ~31)); - NV_WR32(&par->riva.Bitmap->PointE, 0, - (image->dy << 16) | (image->dx & 0xFFFF)); - - d = &par->riva.Bitmap->MonochromeData01E; - - width = (image->width + 31)/32; - size = width * image->height; - while (size >= 16) { - RIVA_FIFO_FREE(par->riva, Bitmap, 16); - for (i = 0; i < 16; i++) { - tmp = *((u32 *)cdat); - cdat = (u8 *)((u32 *)cdat + 1); - reverse_order(&tmp); - NV_WR32(d, i*4, tmp); - } - size -= 16; - } - if (size) { - RIVA_FIFO_FREE(par->riva, Bitmap, size); - for (i = 0; i < size; i++) { - tmp = *((u32 *) cdat); - cdat = (u8 *)((u32 *)cdat + 1); - reverse_order(&tmp); - NV_WR32(d, i*4, tmp); - } - } -} - -/** - * rivafb_cursor - hardware cursor function - * @info: pointer to info structure - * @cursor: pointer to fbcursor structure - * - * DESCRIPTION: - * A cursor function that supports displaying a cursor image via hardware. - * Within the kernel, copy and invert rops are supported. If exported - * to user space, only the copy rop will be supported. - * - * CALLED FROM - * framebuffer hook - */ -static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor) -{ - struct riva_par *par = info->par; - u8 data[MAX_CURS * MAX_CURS/8]; - int i, set = cursor->set; - u16 fg, bg; - - if (cursor->image.width > MAX_CURS || cursor->image.height > MAX_CURS) - return -ENXIO; - - par->riva.ShowHideCursor(&par->riva, 0); - - if (par->cursor_reset) { - set = FB_CUR_SETALL; - par->cursor_reset = 0; - } - - if (set & FB_CUR_SETSIZE) - memset_io(par->riva.CURSOR, 0, MAX_CURS * MAX_CURS * 2); - - if (set & FB_CUR_SETPOS) { - u32 xx, yy, temp; - - yy = cursor->image.dy - info->var.yoffset; - xx = cursor->image.dx - info->var.xoffset; - temp = xx & 0xFFFF; - temp |= yy << 16; - - NV_WR32(par->riva.PRAMDAC, 0x0000300, temp); - } - - - if (set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETIMAGE)) { - u32 bg_idx = cursor->image.bg_color; - u32 fg_idx = cursor->image.fg_color; - u32 s_pitch = (cursor->image.width+7) >> 3; - u32 d_pitch = MAX_CURS/8; - u8 *dat = (u8 *) cursor->image.data; - u8 *msk = (u8 *) cursor->mask; - u8 *src; - - src = kmalloc_array(s_pitch, cursor->image.height, GFP_ATOMIC); - - if (src) { - switch (cursor->rop) { - case ROP_XOR: - for (i = 0; i < s_pitch * cursor->image.height; i++) - src[i] = dat[i] ^ msk[i]; - break; - case ROP_COPY: - default: - for (i = 0; i < s_pitch * cursor->image.height; i++) - src[i] = dat[i] & msk[i]; - break; - } - - fb_pad_aligned_buffer(data, d_pitch, src, s_pitch, - cursor->image.height); - - bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) | - ((info->cmap.green[bg_idx] & 0xf8) << 2) | - ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | - 1 << 15; - - fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) | - ((info->cmap.green[fg_idx] & 0xf8) << 2) | - ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | - 1 << 15; - - par->riva.LockUnlock(&par->riva, 0); - - rivafb_load_cursor_image(par, data, bg, fg, - cursor->image.width, - cursor->image.height); - kfree(src); - } - } - - if (cursor->enable) - par->riva.ShowHideCursor(&par->riva, 1); - - return 0; -} - -static int rivafb_sync(struct fb_info *info) -{ - struct riva_par *par = info->par; - - wait_for_idle(par); - return 0; -} - -/* ------------------------------------------------------------------------- * - * - * initialization helper functions - * - * ------------------------------------------------------------------------- */ - -/* kernel interface */ -static const struct fb_ops riva_fb_ops = { - .owner = THIS_MODULE, - .fb_open = rivafb_open, - .fb_release = rivafb_release, - .fb_check_var = rivafb_check_var, - .fb_set_par = rivafb_set_par, - .fb_setcolreg = rivafb_setcolreg, - .fb_pan_display = rivafb_pan_display, - .fb_blank = rivafb_blank, - .fb_fillrect = rivafb_fillrect, - .fb_copyarea = rivafb_copyarea, - .fb_imageblit = rivafb_imageblit, - .fb_cursor = rivafb_cursor, - .fb_sync = rivafb_sync, -}; - -static int riva_set_fbinfo(struct fb_info *info) -{ - unsigned int cmap_len; - struct riva_par *par = info->par; - - NVTRACE_ENTER(); - info->flags = FBINFO_DEFAULT - | FBINFO_HWACCEL_XPAN - | FBINFO_HWACCEL_YPAN - | FBINFO_HWACCEL_COPYAREA - | FBINFO_HWACCEL_FILLRECT - | FBINFO_HWACCEL_IMAGEBLIT; - - /* Accel seems to not work properly on NV30 yet...*/ - if ((par->riva.Architecture == NV_ARCH_30) || noaccel) { - printk(KERN_DEBUG PFX "disabling acceleration\n"); - info->flags |= FBINFO_HWACCEL_DISABLED; - } - - info->var = rivafb_default_var; - info->fix.visual = (info->var.bits_per_pixel == 8) ? - FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR; - - info->pseudo_palette = par->pseudo_palette; - - cmap_len = riva_get_cmap_len(&info->var); - fb_alloc_cmap(&info->cmap, cmap_len, 0); - - info->pixmap.size = 8 * 1024; - info->pixmap.buf_align = 4; - info->pixmap.access_align = 32; - info->pixmap.flags = FB_PIXMAP_SYSTEM; - info->var.yres_virtual = -1; - NVTRACE_LEAVE(); - return (rivafb_check_var(&info->var, info)); -} - -static int riva_get_EDID_OF(struct fb_info *info, struct pci_dev *pd) -{ - struct riva_par *par = info->par; - struct device_node *dp; - const unsigned char *pedid = NULL; - const unsigned char *disptype = NULL; - static char *propnames[] = { - "DFP,EDID", "LCD,EDID", "EDID", "EDID1", "EDID,B", "EDID,A", NULL }; - int i; - - NVTRACE_ENTER(); - dp = pci_device_to_OF_node(pd); - for (; dp != NULL; dp = dp->child) { - disptype = of_get_property(dp, "display-type", NULL); - if (disptype == NULL) - continue; - if (strncmp(disptype, "LCD", 3) != 0) - continue; - for (i = 0; propnames[i] != NULL; ++i) { - pedid = of_get_property(dp, propnames[i], NULL); - if (pedid != NULL) { - par->EDID = (unsigned char *)pedid; - NVTRACE("LCD found.\n"); - return 1; - } - } - } - NVTRACE_LEAVE(); - return 0; -} - -#if defined(CONFIG_FB_RIVA_I2C) -static int riva_get_EDID_i2c(struct fb_info *info) -{ - struct riva_par *par = info->par; - struct fb_var_screeninfo var; - int i; - - NVTRACE_ENTER(); - par->riva.LockUnlock(&par->riva, 0); - riva_create_i2c_busses(par); - for (i = 0; i < 3; i++) { - if (!par->chan[i].par) - continue; - riva_probe_i2c_connector(par, i, &par->EDID); - if (par->EDID && !fb_parse_edid(par->EDID, &var)) { - printk(PFX "Found EDID Block from BUS %i\n", i); - break; - } - } - - NVTRACE_LEAVE(); - return (par->EDID) ? 1 : 0; -} -#endif /* CONFIG_FB_RIVA_I2C */ - -static void riva_update_default_var(struct fb_var_screeninfo *var, - struct fb_info *info) -{ - struct fb_monspecs *specs = &info->monspecs; - struct fb_videomode modedb; - - NVTRACE_ENTER(); - /* respect mode options */ - if (mode_option) { - fb_find_mode(var, info, mode_option, - specs->modedb, specs->modedb_len, - NULL, 8); - } else if (specs->modedb != NULL) { - /* get first mode in database as fallback */ - modedb = specs->modedb[0]; - /* get preferred timing */ - if (info->monspecs.misc & FB_MISC_1ST_DETAIL) { - int i; - - for (i = 0; i < specs->modedb_len; i++) { - if (specs->modedb[i].flag & FB_MODE_IS_FIRST) { - modedb = specs->modedb[i]; - break; - } - } - } - var->bits_per_pixel = 8; - riva_update_var(var, &modedb); - } - NVTRACE_LEAVE(); -} - - -static void riva_get_EDID(struct fb_info *info, struct pci_dev *pdev) -{ - NVTRACE_ENTER(); - if (riva_get_EDID_OF(info, pdev)) { - NVTRACE_LEAVE(); - return; - } - if (IS_ENABLED(CONFIG_OF)) - printk(PFX "could not retrieve EDID from OF\n"); -#if defined(CONFIG_FB_RIVA_I2C) - if (!riva_get_EDID_i2c(info)) - printk(PFX "could not retrieve EDID from DDC/I2C\n"); -#endif - NVTRACE_LEAVE(); -} - - -static void riva_get_edidinfo(struct fb_info *info) -{ - struct fb_var_screeninfo *var = &rivafb_default_var; - struct riva_par *par = info->par; - - fb_edid_to_monspecs(par->EDID, &info->monspecs); - fb_videomode_to_modelist(info->monspecs.modedb, info->monspecs.modedb_len, - &info->modelist); - riva_update_default_var(var, info); - - /* if user specified flatpanel, we respect that */ - if (info->monspecs.input & FB_DISP_DDI) - par->FlatPanel = 1; -} - -/* ------------------------------------------------------------------------- * - * - * PCI bus - * - * ------------------------------------------------------------------------- */ - -static u32 riva_get_arch(struct pci_dev *pd) -{ - u32 arch = 0; - - switch (pd->device & 0x0ff0) { - case 0x0100: /* GeForce 256 */ - case 0x0110: /* GeForce2 MX */ - case 0x0150: /* GeForce2 */ - case 0x0170: /* GeForce4 MX */ - case 0x0180: /* GeForce4 MX (8x AGP) */ - case 0x01A0: /* nForce */ - case 0x01F0: /* nForce2 */ - arch = NV_ARCH_10; - break; - case 0x0200: /* GeForce3 */ - case 0x0250: /* GeForce4 Ti */ - case 0x0280: /* GeForce4 Ti (8x AGP) */ - arch = NV_ARCH_20; - break; - case 0x0300: /* GeForceFX 5800 */ - case 0x0310: /* GeForceFX 5600 */ - case 0x0320: /* GeForceFX 5200 */ - case 0x0330: /* GeForceFX 5900 */ - case 0x0340: /* GeForceFX 5700 */ - arch = NV_ARCH_30; - break; - case 0x0020: /* TNT, TNT2 */ - arch = NV_ARCH_04; - break; - case 0x0010: /* Riva128 */ - arch = NV_ARCH_03; - break; - default: /* unknown architecture */ - break; - } - return arch; -} - -static int rivafb_probe(struct pci_dev *pd, const struct pci_device_id *ent) -{ - struct riva_par *default_par; - struct fb_info *info; - int ret; - - NVTRACE_ENTER(); - assert(pd != NULL); - - info = framebuffer_alloc(sizeof(struct riva_par), &pd->dev); - if (!info) { - ret = -ENOMEM; - goto err_ret; - } - default_par = info->par; - default_par->pdev = pd; - - info->pixmap.addr = kzalloc(8 * 1024, GFP_KERNEL); - if (info->pixmap.addr == NULL) { - ret = -ENOMEM; - goto err_framebuffer_release; - } - - ret = pci_enable_device(pd); - if (ret < 0) { - printk(KERN_ERR PFX "cannot enable PCI device\n"); - goto err_free_pixmap; - } - - ret = pci_request_regions(pd, "rivafb"); - if (ret < 0) { - printk(KERN_ERR PFX "cannot request PCI regions\n"); - goto err_disable_device; - } - - mutex_init(&default_par->open_lock); - default_par->riva.Architecture = riva_get_arch(pd); - - default_par->Chipset = (pd->vendor << 16) | pd->device; - printk(KERN_INFO PFX "nVidia device/chipset %X\n",default_par->Chipset); - - if(default_par->riva.Architecture == 0) { - printk(KERN_ERR PFX "unknown NV_ARCH\n"); - ret=-ENODEV; - goto err_release_region; - } - if(default_par->riva.Architecture == NV_ARCH_10 || - default_par->riva.Architecture == NV_ARCH_20 || - default_par->riva.Architecture == NV_ARCH_30) { - sprintf(rivafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4); - } else { - sprintf(rivafb_fix.id, "NV%x", default_par->riva.Architecture); - } - - default_par->FlatPanel = flatpanel; - if (flatpanel == 1) - printk(KERN_INFO PFX "flatpanel support enabled\n"); - default_par->forceCRTC = forceCRTC; - - rivafb_fix.mmio_len = pci_resource_len(pd, 0); - rivafb_fix.smem_len = pci_resource_len(pd, 1); - - { - /* enable IO and mem if not already done */ - unsigned short cmd; - - pci_read_config_word(pd, PCI_COMMAND, &cmd); - cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY); - pci_write_config_word(pd, PCI_COMMAND, cmd); - } - - rivafb_fix.mmio_start = pci_resource_start(pd, 0); - rivafb_fix.smem_start = pci_resource_start(pd, 1); - - default_par->ctrl_base = ioremap(rivafb_fix.mmio_start, - rivafb_fix.mmio_len); - if (!default_par->ctrl_base) { - printk(KERN_ERR PFX "cannot ioremap MMIO base\n"); - ret = -EIO; - goto err_release_region; - } - - switch (default_par->riva.Architecture) { - case NV_ARCH_03: - /* Riva128's PRAMIN is in the "framebuffer" space - * Since these cards were never made with more than 8 megabytes - * we can safely allocate this separately. - */ - default_par->riva.PRAMIN = ioremap(rivafb_fix.smem_start + 0x00C00000, 0x00008000); - if (!default_par->riva.PRAMIN) { - printk(KERN_ERR PFX "cannot ioremap PRAMIN region\n"); - ret = -EIO; - goto err_iounmap_ctrl_base; - } - break; - case NV_ARCH_04: - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - default_par->riva.PCRTC0 = - (u32 __iomem *)(default_par->ctrl_base + 0x00600000); - default_par->riva.PRAMIN = - (u32 __iomem *)(default_par->ctrl_base + 0x00710000); - break; - } - riva_common_setup(default_par); - - if (default_par->riva.Architecture == NV_ARCH_03) { - default_par->riva.PCRTC = default_par->riva.PCRTC0 - = default_par->riva.PGRAPH; - } - - rivafb_fix.smem_len = riva_get_memlen(default_par) * 1024; - default_par->dclk_max = riva_get_maxdclk(default_par) * 1000; - info->screen_base = ioremap_wc(rivafb_fix.smem_start, - rivafb_fix.smem_len); - if (!info->screen_base) { - printk(KERN_ERR PFX "cannot ioremap FB base\n"); - ret = -EIO; - goto err_iounmap_pramin; - } - - if (!nomtrr) - default_par->wc_cookie = - arch_phys_wc_add(rivafb_fix.smem_start, - rivafb_fix.smem_len); - - info->fbops = &riva_fb_ops; - info->fix = rivafb_fix; - riva_get_EDID(info, pd); - riva_get_edidinfo(info); - - ret=riva_set_fbinfo(info); - if (ret < 0) { - printk(KERN_ERR PFX "error setting initial video mode\n"); - goto err_iounmap_screen_base; - } - - fb_destroy_modedb(info->monspecs.modedb); - info->monspecs.modedb = NULL; - - pci_set_drvdata(pd, info); - - if (backlight) - riva_bl_init(info->par); - - ret = register_framebuffer(info); - if (ret < 0) { - printk(KERN_ERR PFX - "error registering riva framebuffer\n"); - goto err_iounmap_screen_base; - } - - printk(KERN_INFO PFX - "PCI nVidia %s framebuffer ver %s (%dMB @ 0x%lX)\n", - info->fix.id, - RIVAFB_VERSION, - info->fix.smem_len / (1024 * 1024), - info->fix.smem_start); - - NVTRACE_LEAVE(); - return 0; - -err_iounmap_screen_base: -#ifdef CONFIG_FB_RIVA_I2C - riva_delete_i2c_busses(info->par); -#endif - iounmap(info->screen_base); -err_iounmap_pramin: - if (default_par->riva.Architecture == NV_ARCH_03) - iounmap(default_par->riva.PRAMIN); -err_iounmap_ctrl_base: - iounmap(default_par->ctrl_base); -err_release_region: - pci_release_regions(pd); -err_disable_device: -err_free_pixmap: - kfree(info->pixmap.addr); -err_framebuffer_release: - framebuffer_release(info); -err_ret: - return ret; -} - -static void rivafb_remove(struct pci_dev *pd) -{ - struct fb_info *info = pci_get_drvdata(pd); - struct riva_par *par = info->par; - - NVTRACE_ENTER(); - -#ifdef CONFIG_FB_RIVA_I2C - riva_delete_i2c_busses(par); - kfree(par->EDID); -#endif - - unregister_framebuffer(info); - - riva_bl_exit(info); - arch_phys_wc_del(par->wc_cookie); - iounmap(par->ctrl_base); - iounmap(info->screen_base); - if (par->riva.Architecture == NV_ARCH_03) - iounmap(par->riva.PRAMIN); - pci_release_regions(pd); - kfree(info->pixmap.addr); - framebuffer_release(info); - NVTRACE_LEAVE(); -} - -/* ------------------------------------------------------------------------- * - * - * initialization - * - * ------------------------------------------------------------------------- */ - -#ifndef MODULE -static int rivafb_setup(char *options) -{ - char *this_opt; - - NVTRACE_ENTER(); - if (!options || !*options) - return 0; - - while ((this_opt = strsep(&options, ",")) != NULL) { - if (!strncmp(this_opt, "forceCRTC", 9)) { - char *p; - - p = this_opt + 9; - if (!*p || !*(++p)) continue; - forceCRTC = *p - '0'; - if (forceCRTC < 0 || forceCRTC > 1) - forceCRTC = -1; - } else if (!strncmp(this_opt, "flatpanel", 9)) { - flatpanel = 1; - } else if (!strncmp(this_opt, "backlight:", 10)) { - backlight = simple_strtoul(this_opt+10, NULL, 0); - } else if (!strncmp(this_opt, "nomtrr", 6)) { - nomtrr = 1; - } else if (!strncmp(this_opt, "strictmode", 10)) { - strictmode = 1; - } else if (!strncmp(this_opt, "noaccel", 7)) { - noaccel = 1; - } else - mode_option = this_opt; - } - NVTRACE_LEAVE(); - return 0; -} -#endif /* !MODULE */ - -static struct pci_driver rivafb_driver = { - .name = "rivafb", - .id_table = rivafb_pci_tbl, - .probe = rivafb_probe, - .remove = rivafb_remove, -}; - - - -/* ------------------------------------------------------------------------- * - * - * modularization - * - * ------------------------------------------------------------------------- */ - -static int rivafb_init(void) -{ -#ifndef MODULE - char *option = NULL; - - if (fb_get_options("rivafb", &option)) - return -ENODEV; - rivafb_setup(option); -#endif - return pci_register_driver(&rivafb_driver); -} - - -module_init(rivafb_init); - -static void __exit rivafb_exit(void) -{ - pci_unregister_driver(&rivafb_driver); -} - -module_exit(rivafb_exit); - -module_param(noaccel, bool, 0); -MODULE_PARM_DESC(noaccel, "bool: disable acceleration"); -module_param(flatpanel, int, 0); -MODULE_PARM_DESC(flatpanel, "Enables experimental flat panel support for some chipsets. (0 or 1=enabled) (default=0)"); -module_param(forceCRTC, int, 0); -MODULE_PARM_DESC(forceCRTC, "Forces usage of a particular CRTC in case autodetection fails. (0 or 1) (default=autodetect)"); -module_param(nomtrr, bool, 0); -MODULE_PARM_DESC(nomtrr, "Disables MTRR support (0 or 1=disabled) (default=0)"); -module_param(strictmode, bool, 0); -MODULE_PARM_DESC(strictmode, "Only use video modes from EDID"); - -MODULE_AUTHOR("Ani Joshi, maintainer"); -MODULE_DESCRIPTION("Framebuffer driver for nVidia Riva 128, TNT, TNT2, and the GeForce series"); -MODULE_LICENSE("GPL"); diff --git a/drivers/video/fbdev/riva/nv_driver.c b/drivers/video/fbdev/riva/nv_driver.c deleted file mode 100644 index a3d9c66973ad..000000000000 --- a/drivers/video/fbdev/riva/nv_driver.c +++ /dev/null @@ -1,423 +0,0 @@ -/* $XConsortium: nv_driver.c /main/3 1996/10/28 05:13:37 kaleb $ */ -/* - * Copyright 1996-1997 David J. McKay - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * DAVID J. MCKAY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF - * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* - * GPL licensing note -- nVidia is allowing a liberal interpretation of - * the documentation restriction above, to merely say that this nVidia's - * copyright and disclaimer should be included with all code derived - * from this source. -- Jeff Garzik <jgarzik@pobox.com>, 01/Nov/99 - */ - -/* Hacked together from mga driver and 3.3.4 NVIDIA driver by Jarno Paananen - <jpaana@s2.org> */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_setup.c,v 1.18 2002/08/0 -5 20:47:06 mvojkovi Exp $ */ - -#include <linux/delay.h> -#include <linux/pci.h> -#include <linux/pci_ids.h> -#include "nv_type.h" -#include "rivafb.h" -#include "nvreg.h" - -#define PFX "rivafb: " - -static inline unsigned char MISCin(struct riva_par *par) -{ - return (VGA_RD08(par->riva.PVIO, 0x3cc)); -} - -static Bool -riva_is_connected(struct riva_par *par, Bool second) -{ - volatile U032 __iomem *PRAMDAC = par->riva.PRAMDAC0; - U032 reg52C, reg608; - Bool present; - - if(second) PRAMDAC += 0x800; - - reg52C = NV_RD32(PRAMDAC, 0x052C); - reg608 = NV_RD32(PRAMDAC, 0x0608); - - NV_WR32(PRAMDAC, 0x0608, reg608 & ~0x00010000); - - NV_WR32(PRAMDAC, 0x052C, reg52C & 0x0000FEEE); - mdelay(1); - NV_WR32(PRAMDAC, 0x052C, NV_RD32(PRAMDAC, 0x052C) | 1); - - NV_WR32(par->riva.PRAMDAC0, 0x0610, 0x94050140); - NV_WR32(par->riva.PRAMDAC0, 0x0608, 0x00001000); - - mdelay(1); - - present = (NV_RD32(PRAMDAC, 0x0608) & (1 << 28)) ? TRUE : FALSE; - - NV_WR32(par->riva.PRAMDAC0, 0x0608, - NV_RD32(par->riva.PRAMDAC0, 0x0608) & 0x0000EFFF); - - NV_WR32(PRAMDAC, 0x052C, reg52C); - NV_WR32(PRAMDAC, 0x0608, reg608); - - return present; -} - -static void -riva_override_CRTC(struct riva_par *par) -{ - printk(KERN_INFO PFX - "Detected CRTC controller %i being used\n", - par->SecondCRTC ? 1 : 0); - - if(par->forceCRTC != -1) { - printk(KERN_INFO PFX - "Forcing usage of CRTC %i\n", par->forceCRTC); - par->SecondCRTC = par->forceCRTC; - } -} - -static void -riva_is_second(struct riva_par *par) -{ - if (par->FlatPanel == 1) { - switch(par->Chipset & 0xffff) { - case 0x0174: - case 0x0175: - case 0x0176: - case 0x0177: - case 0x0179: - case 0x017C: - case 0x017D: - case 0x0186: - case 0x0187: - /* this might not be a good default for the chips below */ - case 0x0286: - case 0x028C: - case 0x0316: - case 0x0317: - case 0x031A: - case 0x031B: - case 0x031C: - case 0x031D: - case 0x031E: - case 0x031F: - case 0x0324: - case 0x0325: - case 0x0328: - case 0x0329: - case 0x032C: - case 0x032D: - par->SecondCRTC = TRUE; - break; - default: - par->SecondCRTC = FALSE; - break; - } - } else { - if(riva_is_connected(par, 0)) { - - if (NV_RD32(par->riva.PRAMDAC0, 0x0000052C) & 0x100) - par->SecondCRTC = TRUE; - else - par->SecondCRTC = FALSE; - } else - if (riva_is_connected(par, 1)) { - if(NV_RD32(par->riva.PRAMDAC0, 0x0000252C) & 0x100) - par->SecondCRTC = TRUE; - else - par->SecondCRTC = FALSE; - } else /* default */ - par->SecondCRTC = FALSE; - } - riva_override_CRTC(par); -} - -unsigned long riva_get_memlen(struct riva_par *par) -{ - RIVA_HW_INST *chip = &par->riva; - unsigned long memlen = 0; - unsigned int chipset = par->Chipset; - struct pci_dev* dev; - u32 amt; - int domain = pci_domain_nr(par->pdev->bus); - - switch (chip->Architecture) { - case NV_ARCH_03: - if (NV_RD32(chip->PFB, 0x00000000) & 0x00000020) { - if (((NV_RD32(chip->PMC, 0x00000000) & 0xF0) == 0x20) - && ((NV_RD32(chip->PMC, 0x00000000)&0x0F)>=0x02)) { - /* - * SDRAM 128 ZX. - */ - switch (NV_RD32(chip->PFB,0x00000000) & 0x03) { - case 2: - memlen = 1024 * 4; - break; - case 1: - memlen = 1024 * 2; - break; - default: - memlen = 1024 * 8; - break; - } - } else { - memlen = 1024 * 8; - } - } else { - /* - * SGRAM 128. - */ - switch (NV_RD32(chip->PFB, 0x00000000) & 0x00000003) { - case 0: - memlen = 1024 * 8; - break; - case 2: - memlen = 1024 * 4; - break; - default: - memlen = 1024 * 2; - break; - } - } - break; - case NV_ARCH_04: - if (NV_RD32(chip->PFB, 0x00000000) & 0x00000100) { - memlen = ((NV_RD32(chip->PFB, 0x00000000)>>12)&0x0F) * - 1024 * 2 + 1024 * 2; - } else { - switch (NV_RD32(chip->PFB, 0x00000000) & 0x00000003) { - case 0: - memlen = 1024 * 32; - break; - case 1: - memlen = 1024 * 4; - break; - case 2: - memlen = 1024 * 8; - break; - case 3: - default: - memlen = 1024 * 16; - break; - } - } - break; - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - if(chipset == NV_CHIP_IGEFORCE2) { - - dev = pci_get_domain_bus_and_slot(domain, 0, 1); - pci_read_config_dword(dev, 0x7C, &amt); - pci_dev_put(dev); - memlen = (((amt >> 6) & 31) + 1) * 1024; - } else if (chipset == NV_CHIP_0x01F0) { - dev = pci_get_domain_bus_and_slot(domain, 0, 1); - pci_read_config_dword(dev, 0x84, &amt); - pci_dev_put(dev); - memlen = (((amt >> 4) & 127) + 1) * 1024; - } else { - switch ((NV_RD32(chip->PFB, 0x0000020C) >> 20) & - 0x000000FF){ - case 0x02: - memlen = 1024 * 2; - break; - case 0x04: - memlen = 1024 * 4; - break; - case 0x08: - memlen = 1024 * 8; - break; - case 0x10: - memlen = 1024 * 16; - break; - case 0x20: - memlen = 1024 * 32; - break; - case 0x40: - memlen = 1024 * 64; - break; - case 0x80: - memlen = 1024 * 128; - break; - default: - memlen = 1024 * 16; - break; - } - } - break; - } - return memlen; -} - -unsigned long riva_get_maxdclk(struct riva_par *par) -{ - RIVA_HW_INST *chip = &par->riva; - unsigned long dclk = 0; - - switch (chip->Architecture) { - case NV_ARCH_03: - if (NV_RD32(chip->PFB, 0x00000000) & 0x00000020) { - if (((NV_RD32(chip->PMC, 0x00000000) & 0xF0) == 0x20) - && ((NV_RD32(chip->PMC,0x00000000)&0x0F) >= 0x02)) { - /* - * SDRAM 128 ZX. - */ - dclk = 800000; - } else { - dclk = 1000000; - } - } else { - /* - * SGRAM 128. - */ - dclk = 1000000; - } - break; - case NV_ARCH_04: - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - switch ((NV_RD32(chip->PFB, 0x00000000) >> 3) & 0x00000003) { - case 3: - dclk = 800000; - break; - default: - dclk = 1000000; - break; - } - break; - } - return dclk; -} - -void -riva_common_setup(struct riva_par *par) -{ - par->riva.EnableIRQ = 0; - par->riva.PRAMDAC0 = - (volatile U032 __iomem *)(par->ctrl_base + 0x00680000); - par->riva.PFB = - (volatile U032 __iomem *)(par->ctrl_base + 0x00100000); - par->riva.PFIFO = - (volatile U032 __iomem *)(par->ctrl_base + 0x00002000); - par->riva.PGRAPH = - (volatile U032 __iomem *)(par->ctrl_base + 0x00400000); - par->riva.PEXTDEV = - (volatile U032 __iomem *)(par->ctrl_base + 0x00101000); - par->riva.PTIMER = - (volatile U032 __iomem *)(par->ctrl_base + 0x00009000); - par->riva.PMC = - (volatile U032 __iomem *)(par->ctrl_base + 0x00000000); - par->riva.FIFO = - (volatile U032 __iomem *)(par->ctrl_base + 0x00800000); - par->riva.PCIO0 = par->ctrl_base + 0x00601000; - par->riva.PDIO0 = par->ctrl_base + 0x00681000; - par->riva.PVIO = par->ctrl_base + 0x000C0000; - - par->riva.IO = (MISCin(par) & 0x01) ? 0x3D0 : 0x3B0; - - if (par->FlatPanel == -1) { - switch (par->Chipset & 0xffff) { - case 0x0112: /* known laptop chips */ - case 0x0174: - case 0x0175: - case 0x0176: - case 0x0177: - case 0x0179: - case 0x017C: - case 0x017D: - case 0x0186: - case 0x0187: - case 0x0286: - case 0x028C: - case 0x0316: - case 0x0317: - case 0x031A: - case 0x031B: - case 0x031C: - case 0x031D: - case 0x031E: - case 0x031F: - case 0x0324: - case 0x0325: - case 0x0328: - case 0x0329: - case 0x032C: - case 0x032D: - printk(KERN_INFO PFX - "On a laptop. Assuming Digital Flat Panel\n"); - par->FlatPanel = 1; - break; - default: - break; - } - } - - switch (par->Chipset & 0x0ff0) { - case 0x0110: - if (par->Chipset == NV_CHIP_GEFORCE2_GO) - par->SecondCRTC = TRUE; -#if defined(__powerpc__) - if (par->FlatPanel == 1) - par->SecondCRTC = TRUE; -#endif - riva_override_CRTC(par); - break; - case 0x0170: - case 0x0180: - case 0x01F0: - case 0x0250: - case 0x0280: - case 0x0300: - case 0x0310: - case 0x0320: - case 0x0330: - case 0x0340: - riva_is_second(par); - break; - default: - break; - } - - if (par->SecondCRTC) { - par->riva.PCIO = par->riva.PCIO0 + 0x2000; - par->riva.PCRTC = par->riva.PCRTC0 + 0x800; - par->riva.PRAMDAC = par->riva.PRAMDAC0 + 0x800; - par->riva.PDIO = par->riva.PDIO0 + 0x2000; - } else { - par->riva.PCIO = par->riva.PCIO0; - par->riva.PCRTC = par->riva.PCRTC0; - par->riva.PRAMDAC = par->riva.PRAMDAC0; - par->riva.PDIO = par->riva.PDIO0; - } - - if (par->FlatPanel == -1) { - /* Fix me, need x86 DDC code */ - par->FlatPanel = 0; - } - par->riva.flatPanel = (par->FlatPanel > 0) ? TRUE : FALSE; - - RivaGetConfig(&par->riva, par->pdev, par->Chipset); -} - diff --git a/drivers/video/fbdev/riva/nv_type.h b/drivers/video/fbdev/riva/nv_type.h deleted file mode 100644 index 51937a0ae0a4..000000000000 --- a/drivers/video/fbdev/riva/nv_type.h +++ /dev/null @@ -1,59 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_type.h,v 1.35 2002/08/05 20:47:06 mvojkovi Exp $ */ - -#ifndef __NV_STRUCT_H__ -#define __NV_STRUCT_H__ - -#define NV_CHIP_RIVA_128 ((PCI_VENDOR_ID_NVIDIA_SGS << 16)| PCI_DEVICE_ID_NVIDIA_RIVA128) -#define NV_CHIP_TNT ((PCI_VENDOR_ID_NVIDIA << 16)| PCI_DEVICE_ID_NVIDIA_TNT) -#define NV_CHIP_TNT2 ((PCI_VENDOR_ID_NVIDIA << 16)| PCI_DEVICE_ID_NVIDIA_TNT2) -#define NV_CHIP_UTNT2 ((PCI_VENDOR_ID_NVIDIA << 16)| PCI_DEVICE_ID_NVIDIA_UTNT2) -#define NV_CHIP_VTNT2 ((PCI_VENDOR_ID_NVIDIA << 16)| PCI_DEVICE_ID_NVIDIA_VTNT2) -#define NV_CHIP_UVTNT2 ((PCI_VENDOR_ID_NVIDIA << 16)| PCI_DEVICE_ID_NVIDIA_UVTNT2) -#define NV_CHIP_ITNT2 ((PCI_VENDOR_ID_NVIDIA << 16)| PCI_DEVICE_ID_NVIDIA_ITNT2) -#define NV_CHIP_GEFORCE_256 ((PCI_VENDOR_ID_NVIDIA << 16)| PCI_DEVICE_ID_NVIDIA_GEFORCE_256) -#define NV_CHIP_GEFORCE_DDR ((PCI_VENDOR_ID_NVIDIA << 16)| PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR) -#define NV_CHIP_QUADRO ((PCI_VENDOR_ID_NVIDIA << 16)| PCI_DEVICE_ID_NVIDIA_QUADRO) -#define NV_CHIP_GEFORCE2_MX ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX) -#define NV_CHIP_GEFORCE2_MX_100 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX_100) -#define NV_CHIP_QUADRO2_MXR ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO2_MXR) -#define NV_CHIP_GEFORCE2_GO ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE2_GO) -#define NV_CHIP_GEFORCE2_GTS ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS) -#define NV_CHIP_GEFORCE2_TI ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE2_TI) -#define NV_CHIP_GEFORCE2_ULTRA ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE2_ULTRA) -#define NV_CHIP_QUADRO2_PRO ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO2_PRO) -#define NV_CHIP_GEFORCE4_MX_460 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_460) -#define NV_CHIP_GEFORCE4_MX_440 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440) -#define NV_CHIP_GEFORCE4_MX_420 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420) -#define NV_CHIP_GEFORCE4_440_GO ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO) -#define NV_CHIP_GEFORCE4_420_GO ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO) -#define NV_CHIP_GEFORCE4_420_GO_M32 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO_M32) -#define NV_CHIP_QUADRO4_500XGL ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO4_500XGL) -#define NV_CHIP_GEFORCE4_440_GO_M64 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO_M64) -#define NV_CHIP_QUADRO4_200 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO4_200) -#define NV_CHIP_QUADRO4_550XGL ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO4_550XGL) -#define NV_CHIP_QUADRO4_500_GOGL ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO4_500_GOGL) -#define NV_CHIP_0x0180 ((PCI_VENDOR_ID_NVIDIA << 16) | 0x0180) -#define NV_CHIP_0x0181 ((PCI_VENDOR_ID_NVIDIA << 16) | 0x0181) -#define NV_CHIP_0x0182 ((PCI_VENDOR_ID_NVIDIA << 16) | 0x0182) -#define NV_CHIP_0x0188 ((PCI_VENDOR_ID_NVIDIA << 16) | 0x0188) -#define NV_CHIP_0x018A ((PCI_VENDOR_ID_NVIDIA << 16) | 0x018A) -#define NV_CHIP_0x018B ((PCI_VENDOR_ID_NVIDIA << 16) | 0x018B) -#define NV_CHIP_IGEFORCE2 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_IGEFORCE2) -#define NV_CHIP_0x01F0 ((PCI_VENDOR_ID_NVIDIA << 16) | 0x01F0) -#define NV_CHIP_GEFORCE3 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE3) -#define NV_CHIP_GEFORCE3_TI_200 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE3_TI_200) -#define NV_CHIP_GEFORCE3_TI_500 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE3_TI_500) -#define NV_CHIP_QUADRO_DCC ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO_DCC) -#define NV_CHIP_GEFORCE4_TI_4600 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4600) -#define NV_CHIP_GEFORCE4_TI_4400 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4400) -#define NV_CHIP_GEFORCE4_TI_4200 ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4200) -#define NV_CHIP_QUADRO4_900XGL ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL) -#define NV_CHIP_QUADRO4_750XGL ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL) -#define NV_CHIP_QUADRO4_700XGL ((PCI_VENDOR_ID_NVIDIA << 16) | PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL) -#define NV_CHIP_0x0280 ((PCI_VENDOR_ID_NVIDIA << 16) | 0x0280) -#define NV_CHIP_0x0281 ((PCI_VENDOR_ID_NVIDIA << 16) | 0x0281) -#define NV_CHIP_0x0288 ((PCI_VENDOR_ID_NVIDIA << 16) | 0x0288) -#define NV_CHIP_0x0289 ((PCI_VENDOR_ID_NVIDIA << 16) | 0x0289) - -#endif /* __NV_STRUCT_H__ */ diff --git a/drivers/video/fbdev/riva/nvreg.h b/drivers/video/fbdev/riva/nvreg.h deleted file mode 100644 index abfc167ae8d8..000000000000 --- a/drivers/video/fbdev/riva/nvreg.h +++ /dev/null @@ -1,188 +0,0 @@ -/* $XConsortium: nvreg.h /main/2 1996/10/28 05:13:41 kaleb $ */ -/* - * Copyright 1996-1997 David J. McKay - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * DAVID J. MCKAY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF - * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/vga256/drivers/nv/nvreg.h,v 3.2.2.1 1998/01/18 10:35:36 hohndel Exp $ */ - -#ifndef __NVREG_H_ -#define __NVREG_H_ - -/* Little macro to construct bitmask for contiguous ranges of bits */ -#define BITMASK(t,b) (((unsigned)(1U << (((t)-(b)+1)))-1) << (b)) -#define MASKEXPAND(mask) BITMASK(1?mask,0?mask) - -/* Macro to set specific bitfields (mask has to be a macro x:y) ! */ -#define SetBF(mask,value) ((value) << (0?mask)) -#define GetBF(var,mask) (((unsigned)((var) & MASKEXPAND(mask))) >> (0?mask) ) - -#define MaskAndSetBF(var,mask,value) (var)=(((var)&(~MASKEXPAND(mask)) \ - | SetBF(mask,value))) - -#define DEVICE_BASE(device) (0?NV##_##device) -#define DEVICE_SIZE(device) ((1?NV##_##device) - DEVICE_BASE(device)+1) - -/* This is where we will have to have conditional compilation */ -#define DEVICE_ACCESS(device,reg) \ - nvCONTROL[(NV_##device##_##reg)/4] - -#define DEVICE_WRITE(device,reg,value) DEVICE_ACCESS(device,reg)=(value) -#define DEVICE_READ(device,reg) DEVICE_ACCESS(device,reg) -#define DEVICE_PRINT(device,reg) \ - ErrorF("NV_"#device"_"#reg"=#%08lx\n",DEVICE_ACCESS(device,reg)) -#define DEVICE_DEF(device,mask,value) \ - SetBF(NV_##device##_##mask,NV_##device##_##mask##_##value) -#define DEVICE_VALUE(device,mask,value) SetBF(NV_##device##_##mask,value) -#define DEVICE_MASK(device,mask) MASKEXPAND(NV_##device##_##mask) - -#define PDAC_Write(reg,value) DEVICE_WRITE(PDAC,reg,value) -#define PDAC_Read(reg) DEVICE_READ(PDAC,reg) -#define PDAC_Print(reg) DEVICE_PRINT(PDAC,reg) -#define PDAC_Def(mask,value) DEVICE_DEF(PDAC,mask,value) -#define PDAC_Val(mask,value) DEVICE_VALUE(PDAC,mask,value) -#define PDAC_Mask(mask) DEVICE_MASK(PDAC,mask) - -#define PFB_Write(reg,value) DEVICE_WRITE(PFB,reg,value) -#define PFB_Read(reg) DEVICE_READ(PFB,reg) -#define PFB_Print(reg) DEVICE_PRINT(PFB,reg) -#define PFB_Def(mask,value) DEVICE_DEF(PFB,mask,value) -#define PFB_Val(mask,value) DEVICE_VALUE(PFB,mask,value) -#define PFB_Mask(mask) DEVICE_MASK(PFB,mask) - -#define PRM_Write(reg,value) DEVICE_WRITE(PRM,reg,value) -#define PRM_Read(reg) DEVICE_READ(PRM,reg) -#define PRM_Print(reg) DEVICE_PRINT(PRM,reg) -#define PRM_Def(mask,value) DEVICE_DEF(PRM,mask,value) -#define PRM_Val(mask,value) DEVICE_VALUE(PRM,mask,value) -#define PRM_Mask(mask) DEVICE_MASK(PRM,mask) - -#define PGRAPH_Write(reg,value) DEVICE_WRITE(PGRAPH,reg,value) -#define PGRAPH_Read(reg) DEVICE_READ(PGRAPH,reg) -#define PGRAPH_Print(reg) DEVICE_PRINT(PGRAPH,reg) -#define PGRAPH_Def(mask,value) DEVICE_DEF(PGRAPH,mask,value) -#define PGRAPH_Val(mask,value) DEVICE_VALUE(PGRAPH,mask,value) -#define PGRAPH_Mask(mask) DEVICE_MASK(PGRAPH,mask) - -#define PDMA_Write(reg,value) DEVICE_WRITE(PDMA,reg,value) -#define PDMA_Read(reg) DEVICE_READ(PDMA,reg) -#define PDMA_Print(reg) DEVICE_PRINT(PDMA,reg) -#define PDMA_Def(mask,value) DEVICE_DEF(PDMA,mask,value) -#define PDMA_Val(mask,value) DEVICE_VALUE(PDMA,mask,value) -#define PDMA_Mask(mask) DEVICE_MASK(PDMA,mask) - -#define PTIMER_Write(reg,value) DEVICE_WRITE(PTIMER,reg,value) -#define PTIMER_Read(reg) DEVICE_READ(PTIMER,reg) -#define PTIMER_Print(reg) DEVICE_PRINT(PTIMER,reg) -#define PTIMER_Def(mask,value) DEVICE_DEF(PTIMER,mask,value) -#define PTIMER_Val(mask,value) DEVICE_VALUE(PTIEMR,mask,value) -#define PTIMER_Mask(mask) DEVICE_MASK(PTIMER,mask) - -#define PEXTDEV_Write(reg,value) DEVICE_WRITE(PEXTDEV,reg,value) -#define PEXTDEV_Read(reg) DEVICE_READ(PEXTDEV,reg) -#define PEXTDEV_Print(reg) DEVICE_PRINT(PEXTDEV,reg) -#define PEXTDEV_Def(mask,value) DEVICE_DEF(PEXTDEV,mask,value) -#define PEXTDEV_Val(mask,value) DEVICE_VALUE(PEXTDEV,mask,value) -#define PEXTDEV_Mask(mask) DEVICE_MASK(PEXTDEV,mask) - -#define PFIFO_Write(reg,value) DEVICE_WRITE(PFIFO,reg,value) -#define PFIFO_Read(reg) DEVICE_READ(PFIFO,reg) -#define PFIFO_Print(reg) DEVICE_PRINT(PFIFO,reg) -#define PFIFO_Def(mask,value) DEVICE_DEF(PFIFO,mask,value) -#define PFIFO_Val(mask,value) DEVICE_VALUE(PFIFO,mask,value) -#define PFIFO_Mask(mask) DEVICE_MASK(PFIFO,mask) - -#define PRAM_Write(reg,value) DEVICE_WRITE(PRAM,reg,value) -#define PRAM_Read(reg) DEVICE_READ(PRAM,reg) -#define PRAM_Print(reg) DEVICE_PRINT(PRAM,reg) -#define PRAM_Def(mask,value) DEVICE_DEF(PRAM,mask,value) -#define PRAM_Val(mask,value) DEVICE_VALUE(PRAM,mask,value) -#define PRAM_Mask(mask) DEVICE_MASK(PRAM,mask) - -#define PRAMFC_Write(reg,value) DEVICE_WRITE(PRAMFC,reg,value) -#define PRAMFC_Read(reg) DEVICE_READ(PRAMFC,reg) -#define PRAMFC_Print(reg) DEVICE_PRINT(PRAMFC,reg) -#define PRAMFC_Def(mask,value) DEVICE_DEF(PRAMFC,mask,value) -#define PRAMFC_Val(mask,value) DEVICE_VALUE(PRAMFC,mask,value) -#define PRAMFC_Mask(mask) DEVICE_MASK(PRAMFC,mask) - -#define PMC_Write(reg,value) DEVICE_WRITE(PMC,reg,value) -#define PMC_Read(reg) DEVICE_READ(PMC,reg) -#define PMC_Print(reg) DEVICE_PRINT(PMC,reg) -#define PMC_Def(mask,value) DEVICE_DEF(PMC,mask,value) -#define PMC_Val(mask,value) DEVICE_VALUE(PMC,mask,value) -#define PMC_Mask(mask) DEVICE_MASK(PMC,mask) - -#define PMC_Write(reg,value) DEVICE_WRITE(PMC,reg,value) -#define PMC_Read(reg) DEVICE_READ(PMC,reg) -#define PMC_Print(reg) DEVICE_PRINT(PMC,reg) -#define PMC_Def(mask,value) DEVICE_DEF(PMC,mask,value) -#define PMC_Val(mask,value) DEVICE_VALUE(PMC,mask,value) -#define PMC_Mask(mask) DEVICE_MASK(PMC,mask) - - -#define PBUS_Write(reg,value) DEVICE_WRITE(PBUS,reg,value) -#define PBUS_Read(reg) DEVICE_READ(PBUS,reg) -#define PBUS_Print(reg) DEVICE_PRINT(PBUS,reg) -#define PBUS_Def(mask,value) DEVICE_DEF(PBUS,mask,value) -#define PBUS_Val(mask,value) DEVICE_VALUE(PBUS,mask,value) -#define PBUS_Mask(mask) DEVICE_MASK(PBUS,mask) - - -#define PRAMDAC_Write(reg,value) DEVICE_WRITE(PRAMDAC,reg,value) -#define PRAMDAC_Read(reg) DEVICE_READ(PRAMDAC,reg) -#define PRAMDAC_Print(reg) DEVICE_PRINT(PRAMDAC,reg) -#define PRAMDAC_Def(mask,value) DEVICE_DEF(PRAMDAC,mask,value) -#define PRAMDAC_Val(mask,value) DEVICE_VALUE(PRAMDAC,mask,value) -#define PRAMDAC_Mask(mask) DEVICE_MASK(PRAMDAC,mask) - - -#define PDAC_ReadExt(reg) \ - ((PDAC_Write(INDEX_LO,(NV_PDAC_EXT_##reg) & 0xff)),\ - (PDAC_Write(INDEX_HI,((NV_PDAC_EXT_##reg) >> 8) & 0xff)),\ - (PDAC_Read(INDEX_DATA))) - -#define PDAC_WriteExt(reg,value)\ - ((PDAC_Write(INDEX_LO,(NV_PDAC_EXT_##reg) & 0xff)),\ - (PDAC_Write(INDEX_HI,((NV_PDAC_EXT_##reg) >> 8) & 0xff)),\ - (PDAC_Write(INDEX_DATA,(value)))) - -#define CRTC_Write(index,value) outb((index), 0x3d4); outb(value, 0x3d5) -#define CRTC_Read(index) (outb(index, 0x3d4),inb(0x3d5)) - -#define PCRTC_Write(index,value) CRTC_Write(NV_PCRTC_##index,value) -#define PCRTC_Read(index) CRTC_Read(NV_PCRTC_##index) - -#define PCRTC_Def(mask,value) DEVICE_DEF(PCRTC,mask,value) -#define PCRTC_Val(mask,value) DEVICE_VALUE(PCRTC,mask,value) -#define PCRTC_Mask(mask) DEVICE_MASK(PCRTC,mask) - -#define SR_Write(index,value) outb(0x3c4,(index));outb(0x3c5,value) -#define SR_Read(index) (outb(0x3c4,index),inb(0x3c5)) - -extern volatile unsigned *nvCONTROL; - -typedef enum {NV1,NV3,NV4,NumNVChips} NVChipType; - -NVChipType GetChipType(void); - -#endif - - diff --git a/drivers/video/fbdev/riva/riva_hw.c b/drivers/video/fbdev/riva/riva_hw.c deleted file mode 100644 index 4168ac464565..000000000000 --- a/drivers/video/fbdev/riva/riva_hw.c +++ /dev/null @@ -1,2254 +0,0 @@ - /***************************************************************************\ -|* *| -|* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NOTICE TO USER: The source code is copyrighted under U.S. and *| -|* international laws. Users and possessors of this source code are *| -|* hereby granted a nonexclusive, royalty-free copyright license to *| -|* use this code in individual and commercial software. *| -|* *| -|* Any use of this source code must include, in the user documenta- *| -|* tion and internal comments to the code, notices to the end user *| -|* as follows: *| -|* *| -|* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *| -|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *| -|* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *| -|* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *| -|* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *| -|* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *| -|* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *| -|* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *| -|* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *| -|* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *| -|* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *| -|* *| -|* U.S. Government End Users. This source code is a "commercial *| -|* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *| -|* consisting of "commercial computer software" and "commercial *| -|* computer software documentation," as such terms are used in *| -|* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *| -|* ment only as a commercial end item. Consistent with 48 C.F.R. *| -|* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *| -|* all U.S. Government End Users acquire the source code with only *| -|* those rights set forth herein. *| -|* *| - \***************************************************************************/ - -/* - * GPL licensing note -- nVidia is allowing a liberal interpretation of - * the documentation restriction above, to merely say that this nVidia's - * copyright and disclaimer should be included with all code derived - * from this source. -- Jeff Garzik <jgarzik@pobox.com>, 01/Nov/99 - */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/riva_hw.c,v 1.33 2002/08/05 20:47:06 mvojkovi Exp $ */ - -#include <linux/kernel.h> -#include <linux/pci.h> -#include <linux/pci_ids.h> -#include "riva_hw.h" -#include "riva_tbl.h" -#include "nv_type.h" - -/* - * This file is an OS-agnostic file used to make RIVA 128 and RIVA TNT - * operate identically (except TNT has more memory and better 3D quality. - */ -static int nv3Busy -( - RIVA_HW_INST *chip -) -{ - return ((NV_RD32(&chip->Rop->FifoFree, 0) < chip->FifoEmptyCount) || - NV_RD32(&chip->PGRAPH[0x000006B0/4], 0) & 0x01); -} -static int nv4Busy -( - RIVA_HW_INST *chip -) -{ - return ((NV_RD32(&chip->Rop->FifoFree, 0) < chip->FifoEmptyCount) || - NV_RD32(&chip->PGRAPH[0x00000700/4], 0) & 0x01); -} -static int nv10Busy -( - RIVA_HW_INST *chip -) -{ - return ((NV_RD32(&chip->Rop->FifoFree, 0) < chip->FifoEmptyCount) || - NV_RD32(&chip->PGRAPH[0x00000700/4], 0) & 0x01); -} - -static void vgaLockUnlock -( - RIVA_HW_INST *chip, - int Lock -) -{ - U008 cr11; - VGA_WR08(chip->PCIO, 0x3D4, 0x11); - cr11 = VGA_RD08(chip->PCIO, 0x3D5); - if(Lock) cr11 |= 0x80; - else cr11 &= ~0x80; - VGA_WR08(chip->PCIO, 0x3D5, cr11); -} -static void nv3LockUnlock -( - RIVA_HW_INST *chip, - int Lock -) -{ - VGA_WR08(chip->PVIO, 0x3C4, 0x06); - VGA_WR08(chip->PVIO, 0x3C5, Lock ? 0x99 : 0x57); - vgaLockUnlock(chip, Lock); -} -static void nv4LockUnlock -( - RIVA_HW_INST *chip, - int Lock -) -{ - VGA_WR08(chip->PCIO, 0x3D4, 0x1F); - VGA_WR08(chip->PCIO, 0x3D5, Lock ? 0x99 : 0x57); - vgaLockUnlock(chip, Lock); -} - -static int ShowHideCursor -( - RIVA_HW_INST *chip, - int ShowHide -) -{ - int cursor; - cursor = chip->CurrentState->cursor1; - chip->CurrentState->cursor1 = (chip->CurrentState->cursor1 & 0xFE) | - (ShowHide & 0x01); - VGA_WR08(chip->PCIO, 0x3D4, 0x31); - VGA_WR08(chip->PCIO, 0x3D5, chip->CurrentState->cursor1); - return (cursor & 0x01); -} - -/****************************************************************************\ -* * -* The video arbitration routines calculate some "magic" numbers. Fixes * -* the snow seen when accessing the framebuffer without it. * -* It just works (I hope). * -* * -\****************************************************************************/ - -#define DEFAULT_GR_LWM 100 -#define DEFAULT_VID_LWM 100 -#define DEFAULT_GR_BURST_SIZE 256 -#define DEFAULT_VID_BURST_SIZE 128 -#define VIDEO 0 -#define GRAPHICS 1 -#define MPORT 2 -#define ENGINE 3 -#define GFIFO_SIZE 320 -#define GFIFO_SIZE_128 256 -#define MFIFO_SIZE 120 -#define VFIFO_SIZE 256 - -typedef struct { - int gdrain_rate; - int vdrain_rate; - int mdrain_rate; - int gburst_size; - int vburst_size; - char vid_en; - char gr_en; - int wcmocc, wcgocc, wcvocc, wcvlwm, wcglwm; - int by_gfacc; - char vid_only_once; - char gr_only_once; - char first_vacc; - char first_gacc; - char first_macc; - int vocc; - int gocc; - int mocc; - char cur; - char engine_en; - char converged; - int priority; -} nv3_arb_info; -typedef struct { - int graphics_lwm; - int video_lwm; - int graphics_burst_size; - int video_burst_size; - int graphics_hi_priority; - int media_hi_priority; - int rtl_values; - int valid; -} nv3_fifo_info; -typedef struct { - char pix_bpp; - char enable_video; - char gr_during_vid; - char enable_mp; - int memory_width; - int video_scale; - int pclk_khz; - int mclk_khz; - int mem_page_miss; - int mem_latency; - char mem_aligned; -} nv3_sim_state; -typedef struct { - int graphics_lwm; - int video_lwm; - int graphics_burst_size; - int video_burst_size; - int valid; -} nv4_fifo_info; -typedef struct { - int pclk_khz; - int mclk_khz; - int nvclk_khz; - char mem_page_miss; - char mem_latency; - int memory_width; - char enable_video; - char gr_during_vid; - char pix_bpp; - char mem_aligned; - char enable_mp; -} nv4_sim_state; -typedef struct { - int graphics_lwm; - int video_lwm; - int graphics_burst_size; - int video_burst_size; - int valid; -} nv10_fifo_info; -typedef struct { - int pclk_khz; - int mclk_khz; - int nvclk_khz; - char mem_page_miss; - char mem_latency; - u32 memory_type; - int memory_width; - char enable_video; - char gr_during_vid; - char pix_bpp; - char mem_aligned; - char enable_mp; -} nv10_sim_state; -static int nv3_iterate(nv3_fifo_info *res_info, nv3_sim_state * state, nv3_arb_info *ainfo) -{ - int iter = 0; - int tmp; - int vfsize, mfsize, gfsize; - int mburst_size = 32; - int mmisses, gmisses, vmisses; - int misses; - int vlwm, glwm, mlwm; - int last, next, cur; - int max_gfsize ; - long ns; - - vlwm = 0; - glwm = 0; - mlwm = 0; - vfsize = 0; - gfsize = 0; - cur = ainfo->cur; - mmisses = 2; - gmisses = 2; - vmisses = 2; - if (ainfo->gburst_size == 128) max_gfsize = GFIFO_SIZE_128; - else max_gfsize = GFIFO_SIZE; - max_gfsize = GFIFO_SIZE; - while (1) - { - if (ainfo->vid_en) - { - if (ainfo->wcvocc > ainfo->vocc) ainfo->wcvocc = ainfo->vocc; - if (ainfo->wcvlwm > vlwm) ainfo->wcvlwm = vlwm ; - ns = 1000000 * ainfo->vburst_size/(state->memory_width/8)/state->mclk_khz; - vfsize = ns * ainfo->vdrain_rate / 1000000; - vfsize = ainfo->wcvlwm - ainfo->vburst_size + vfsize; - } - if (state->enable_mp) - { - if (ainfo->wcmocc > ainfo->mocc) ainfo->wcmocc = ainfo->mocc; - } - if (ainfo->gr_en) - { - if (ainfo->wcglwm > glwm) ainfo->wcglwm = glwm ; - if (ainfo->wcgocc > ainfo->gocc) ainfo->wcgocc = ainfo->gocc; - ns = 1000000 * (ainfo->gburst_size/(state->memory_width/8))/state->mclk_khz; - gfsize = (ns * (long) ainfo->gdrain_rate)/1000000; - gfsize = ainfo->wcglwm - ainfo->gburst_size + gfsize; - } - mfsize = 0; - if (!state->gr_during_vid && ainfo->vid_en) - if (ainfo->vid_en && (ainfo->vocc < 0) && !ainfo->vid_only_once) - next = VIDEO; - else if (ainfo->mocc < 0) - next = MPORT; - else if (ainfo->gocc< ainfo->by_gfacc) - next = GRAPHICS; - else return (0); - else switch (ainfo->priority) - { - case VIDEO: - if (ainfo->vid_en && ainfo->vocc<0 && !ainfo->vid_only_once) - next = VIDEO; - else if (ainfo->gr_en && ainfo->gocc<0 && !ainfo->gr_only_once) - next = GRAPHICS; - else if (ainfo->mocc<0) - next = MPORT; - else return (0); - break; - case GRAPHICS: - if (ainfo->gr_en && ainfo->gocc<0 && !ainfo->gr_only_once) - next = GRAPHICS; - else if (ainfo->vid_en && ainfo->vocc<0 && !ainfo->vid_only_once) - next = VIDEO; - else if (ainfo->mocc<0) - next = MPORT; - else return (0); - break; - default: - if (ainfo->mocc<0) - next = MPORT; - else if (ainfo->gr_en && ainfo->gocc<0 && !ainfo->gr_only_once) - next = GRAPHICS; - else if (ainfo->vid_en && ainfo->vocc<0 && !ainfo->vid_only_once) - next = VIDEO; - else return (0); - break; - } - last = cur; - cur = next; - iter++; - switch (cur) - { - case VIDEO: - if (last==cur) misses = 0; - else if (ainfo->first_vacc) misses = vmisses; - else misses = 1; - ainfo->first_vacc = 0; - if (last!=cur) - { - ns = 1000000 * (vmisses*state->mem_page_miss + state->mem_latency)/state->mclk_khz; - vlwm = ns * ainfo->vdrain_rate/ 1000000; - vlwm = ainfo->vocc - vlwm; - } - ns = 1000000*(misses*state->mem_page_miss + ainfo->vburst_size)/(state->memory_width/8)/state->mclk_khz; - ainfo->vocc = ainfo->vocc + ainfo->vburst_size - ns*ainfo->vdrain_rate/1000000; - ainfo->gocc = ainfo->gocc - ns*ainfo->gdrain_rate/1000000; - ainfo->mocc = ainfo->mocc - ns*ainfo->mdrain_rate/1000000; - break; - case GRAPHICS: - if (last==cur) misses = 0; - else if (ainfo->first_gacc) misses = gmisses; - else misses = 1; - ainfo->first_gacc = 0; - if (last!=cur) - { - ns = 1000000*(gmisses*state->mem_page_miss + state->mem_latency)/state->mclk_khz ; - glwm = ns * ainfo->gdrain_rate/1000000; - glwm = ainfo->gocc - glwm; - } - ns = 1000000*(misses*state->mem_page_miss + ainfo->gburst_size/(state->memory_width/8))/state->mclk_khz; - ainfo->vocc = ainfo->vocc + 0 - ns*ainfo->vdrain_rate/1000000; - ainfo->gocc = ainfo->gocc + ainfo->gburst_size - ns*ainfo->gdrain_rate/1000000; - ainfo->mocc = ainfo->mocc + 0 - ns*ainfo->mdrain_rate/1000000; - break; - default: - if (last==cur) misses = 0; - else if (ainfo->first_macc) misses = mmisses; - else misses = 1; - ainfo->first_macc = 0; - ns = 1000000*(misses*state->mem_page_miss + mburst_size/(state->memory_width/8))/state->mclk_khz; - ainfo->vocc = ainfo->vocc + 0 - ns*ainfo->vdrain_rate/1000000; - ainfo->gocc = ainfo->gocc + 0 - ns*ainfo->gdrain_rate/1000000; - ainfo->mocc = ainfo->mocc + mburst_size - ns*ainfo->mdrain_rate/1000000; - break; - } - if (iter>100) - { - ainfo->converged = 0; - return (1); - } - ns = 1000000*ainfo->gburst_size/(state->memory_width/8)/state->mclk_khz; - tmp = ns * ainfo->gdrain_rate/1000000; - if (abs(ainfo->gburst_size) + ((abs(ainfo->wcglwm) + 16 ) & ~0x7) - tmp > max_gfsize) - { - ainfo->converged = 0; - return (1); - } - ns = 1000000*ainfo->vburst_size/(state->memory_width/8)/state->mclk_khz; - tmp = ns * ainfo->vdrain_rate/1000000; - if (abs(ainfo->vburst_size) + (abs(ainfo->wcvlwm + 32) & ~0xf) - tmp> VFIFO_SIZE) - { - ainfo->converged = 0; - return (1); - } - if (abs(ainfo->gocc) > max_gfsize) - { - ainfo->converged = 0; - return (1); - } - if (abs(ainfo->vocc) > VFIFO_SIZE) - { - ainfo->converged = 0; - return (1); - } - if (abs(ainfo->mocc) > MFIFO_SIZE) - { - ainfo->converged = 0; - return (1); - } - if (abs(vfsize) > VFIFO_SIZE) - { - ainfo->converged = 0; - return (1); - } - if (abs(gfsize) > max_gfsize) - { - ainfo->converged = 0; - return (1); - } - if (abs(mfsize) > MFIFO_SIZE) - { - ainfo->converged = 0; - return (1); - } - } -} -static char nv3_arb(nv3_fifo_info * res_info, nv3_sim_state * state, nv3_arb_info *ainfo) -{ - long ens, vns, mns, gns; - int mmisses, gmisses, vmisses, eburst_size, mburst_size; - int refresh_cycle; - - refresh_cycle = 2*(state->mclk_khz/state->pclk_khz) + 5; - mmisses = 2; - if (state->mem_aligned) gmisses = 2; - else gmisses = 3; - vmisses = 2; - eburst_size = state->memory_width * 1; - mburst_size = 32; - gns = 1000000 * (gmisses*state->mem_page_miss + state->mem_latency)/state->mclk_khz; - ainfo->by_gfacc = gns*ainfo->gdrain_rate/1000000; - ainfo->wcmocc = 0; - ainfo->wcgocc = 0; - ainfo->wcvocc = 0; - ainfo->wcvlwm = 0; - ainfo->wcglwm = 0; - ainfo->engine_en = 1; - ainfo->converged = 1; - if (ainfo->engine_en) - { - ens = 1000000*(state->mem_page_miss + eburst_size/(state->memory_width/8) +refresh_cycle)/state->mclk_khz; - ainfo->mocc = state->enable_mp ? 0-ens*ainfo->mdrain_rate/1000000 : 0; - ainfo->vocc = ainfo->vid_en ? 0-ens*ainfo->vdrain_rate/1000000 : 0; - ainfo->gocc = ainfo->gr_en ? 0-ens*ainfo->gdrain_rate/1000000 : 0; - ainfo->cur = ENGINE; - ainfo->first_vacc = 1; - ainfo->first_gacc = 1; - ainfo->first_macc = 1; - nv3_iterate(res_info, state,ainfo); - } - if (state->enable_mp) - { - mns = 1000000 * (mmisses*state->mem_page_miss + mburst_size/(state->memory_width/8) + refresh_cycle)/state->mclk_khz; - ainfo->mocc = state->enable_mp ? 0 : mburst_size - mns*ainfo->mdrain_rate/1000000; - ainfo->vocc = ainfo->vid_en ? 0 : 0- mns*ainfo->vdrain_rate/1000000; - ainfo->gocc = ainfo->gr_en ? 0: 0- mns*ainfo->gdrain_rate/1000000; - ainfo->cur = MPORT; - ainfo->first_vacc = 1; - ainfo->first_gacc = 1; - ainfo->first_macc = 0; - nv3_iterate(res_info, state,ainfo); - } - if (ainfo->gr_en) - { - ainfo->first_vacc = 1; - ainfo->first_gacc = 0; - ainfo->first_macc = 1; - gns = 1000000*(gmisses*state->mem_page_miss + ainfo->gburst_size/(state->memory_width/8) + refresh_cycle)/state->mclk_khz; - ainfo->gocc = ainfo->gburst_size - gns*ainfo->gdrain_rate/1000000; - ainfo->vocc = ainfo->vid_en? 0-gns*ainfo->vdrain_rate/1000000 : 0; - ainfo->mocc = state->enable_mp ? 0-gns*ainfo->mdrain_rate/1000000: 0; - ainfo->cur = GRAPHICS; - nv3_iterate(res_info, state,ainfo); - } - if (ainfo->vid_en) - { - ainfo->first_vacc = 0; - ainfo->first_gacc = 1; - ainfo->first_macc = 1; - vns = 1000000*(vmisses*state->mem_page_miss + ainfo->vburst_size/(state->memory_width/8) + refresh_cycle)/state->mclk_khz; - ainfo->vocc = ainfo->vburst_size - vns*ainfo->vdrain_rate/1000000; - ainfo->gocc = ainfo->gr_en? (0-vns*ainfo->gdrain_rate/1000000) : 0; - ainfo->mocc = state->enable_mp? 0-vns*ainfo->mdrain_rate/1000000 :0 ; - ainfo->cur = VIDEO; - nv3_iterate(res_info, state, ainfo); - } - if (ainfo->converged) - { - res_info->graphics_lwm = (int)abs(ainfo->wcglwm) + 16; - res_info->video_lwm = (int)abs(ainfo->wcvlwm) + 32; - res_info->graphics_burst_size = ainfo->gburst_size; - res_info->video_burst_size = ainfo->vburst_size; - res_info->graphics_hi_priority = (ainfo->priority == GRAPHICS); - res_info->media_hi_priority = (ainfo->priority == MPORT); - if (res_info->video_lwm > 160) - { - res_info->graphics_lwm = 256; - res_info->video_lwm = 128; - res_info->graphics_burst_size = 64; - res_info->video_burst_size = 64; - res_info->graphics_hi_priority = 0; - res_info->media_hi_priority = 0; - ainfo->converged = 0; - return (0); - } - if (res_info->video_lwm > 128) - { - res_info->video_lwm = 128; - } - return (1); - } - else - { - res_info->graphics_lwm = 256; - res_info->video_lwm = 128; - res_info->graphics_burst_size = 64; - res_info->video_burst_size = 64; - res_info->graphics_hi_priority = 0; - res_info->media_hi_priority = 0; - return (0); - } -} -static char nv3_get_param(nv3_fifo_info *res_info, nv3_sim_state * state, nv3_arb_info *ainfo) -{ - int done, g,v, p; - - done = 0; - for (p=0; p < 2; p++) - { - for (g=128 ; g > 32; g= g>> 1) - { - for (v=128; v >=32; v = v>> 1) - { - ainfo->priority = p; - ainfo->gburst_size = g; - ainfo->vburst_size = v; - done = nv3_arb(res_info, state,ainfo); - if (done && (g==128)) - if ((res_info->graphics_lwm + g) > 256) - done = 0; - if (done) - goto Done; - } - } - } - - Done: - return done; -} -static void nv3CalcArbitration -( - nv3_fifo_info * res_info, - nv3_sim_state * state -) -{ - nv3_fifo_info save_info; - nv3_arb_info ainfo; - char res_gr, res_vid; - - ainfo.gr_en = 1; - ainfo.vid_en = state->enable_video; - ainfo.vid_only_once = 0; - ainfo.gr_only_once = 0; - ainfo.gdrain_rate = (int) state->pclk_khz * (state->pix_bpp/8); - ainfo.vdrain_rate = (int) state->pclk_khz * 2; - if (state->video_scale != 0) - ainfo.vdrain_rate = ainfo.vdrain_rate/state->video_scale; - ainfo.mdrain_rate = 33000; - res_info->rtl_values = 0; - if (!state->gr_during_vid && state->enable_video) - { - ainfo.gr_only_once = 1; - ainfo.gr_en = 1; - ainfo.gdrain_rate = 0; - res_vid = nv3_get_param(res_info, state, &ainfo); - res_vid = ainfo.converged; - save_info.video_lwm = res_info->video_lwm; - save_info.video_burst_size = res_info->video_burst_size; - ainfo.vid_en = 1; - ainfo.vid_only_once = 1; - ainfo.gr_en = 1; - ainfo.gdrain_rate = (int) state->pclk_khz * (state->pix_bpp/8); - ainfo.vdrain_rate = 0; - res_gr = nv3_get_param(res_info, state, &ainfo); - res_gr = ainfo.converged; - res_info->video_lwm = save_info.video_lwm; - res_info->video_burst_size = save_info.video_burst_size; - res_info->valid = res_gr & res_vid; - } - else - { - if (!ainfo.gr_en) ainfo.gdrain_rate = 0; - if (!ainfo.vid_en) ainfo.vdrain_rate = 0; - res_gr = nv3_get_param(res_info, state, &ainfo); - res_info->valid = ainfo.converged; - } -} -static void nv3UpdateArbitrationSettings -( - unsigned VClk, - unsigned pixelDepth, - unsigned *burst, - unsigned *lwm, - RIVA_HW_INST *chip -) -{ - nv3_fifo_info fifo_data; - nv3_sim_state sim_data; - unsigned int M, N, P, pll, MClk; - - pll = NV_RD32(&chip->PRAMDAC0[0x00000504/4], 0); - M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; - MClk = (N * chip->CrystalFreqKHz / M) >> P; - sim_data.pix_bpp = (char)pixelDepth; - sim_data.enable_video = 0; - sim_data.enable_mp = 0; - sim_data.video_scale = 1; - sim_data.memory_width = (NV_RD32(&chip->PEXTDEV[0x00000000/4], 0) & 0x10) ? - 128 : 64; - sim_data.memory_width = 128; - - sim_data.mem_latency = 9; - sim_data.mem_aligned = 1; - sim_data.mem_page_miss = 11; - sim_data.gr_during_vid = 0; - sim_data.pclk_khz = VClk; - sim_data.mclk_khz = MClk; - nv3CalcArbitration(&fifo_data, &sim_data); - if (fifo_data.valid) - { - int b = fifo_data.graphics_burst_size >> 4; - *burst = 0; - while (b >>= 1) - (*burst)++; - *lwm = fifo_data.graphics_lwm >> 3; - } - else - { - *lwm = 0x24; - *burst = 0x2; - } -} -static void nv4CalcArbitration -( - nv4_fifo_info *fifo, - nv4_sim_state *arb -) -{ - int data, pagemiss, cas,width, video_enable, color_key_enable, bpp, align; - int nvclks, mclks, pclks, vpagemiss, crtpagemiss, vbs; - int found, mclk_extra, mclk_loop, cbs, m1, p1; - int mclk_freq, pclk_freq, nvclk_freq, mp_enable; - int us_m, us_n, us_p, video_drain_rate, crtc_drain_rate; - int vpm_us, us_video, vlwm, video_fill_us, cpm_us, us_crt,clwm; - int craw, vraw; - - fifo->valid = 1; - pclk_freq = arb->pclk_khz; - mclk_freq = arb->mclk_khz; - nvclk_freq = arb->nvclk_khz; - pagemiss = arb->mem_page_miss; - cas = arb->mem_latency; - width = arb->memory_width >> 6; - video_enable = arb->enable_video; - color_key_enable = arb->gr_during_vid; - bpp = arb->pix_bpp; - align = arb->mem_aligned; - mp_enable = arb->enable_mp; - clwm = 0; - vlwm = 0; - cbs = 128; - pclks = 2; - nvclks = 2; - nvclks += 2; - nvclks += 1; - mclks = 5; - mclks += 3; - mclks += 1; - mclks += cas; - mclks += 1; - mclks += 1; - mclks += 1; - mclks += 1; - mclk_extra = 3; - nvclks += 2; - nvclks += 1; - nvclks += 1; - nvclks += 1; - if (mp_enable) - mclks+=4; - nvclks += 0; - pclks += 0; - found = 0; - vbs = 0; - while (found != 1) - { - fifo->valid = 1; - found = 1; - mclk_loop = mclks+mclk_extra; - us_m = mclk_loop *1000*1000 / mclk_freq; - us_n = nvclks*1000*1000 / nvclk_freq; - us_p = nvclks*1000*1000 / pclk_freq; - if (video_enable) - { - video_drain_rate = pclk_freq * 2; - crtc_drain_rate = pclk_freq * bpp/8; - vpagemiss = 2; - vpagemiss += 1; - crtpagemiss = 2; - vpm_us = (vpagemiss * pagemiss)*1000*1000/mclk_freq; - if (nvclk_freq * 2 > mclk_freq * width) - video_fill_us = cbs*1000*1000 / 16 / nvclk_freq ; - else - video_fill_us = cbs*1000*1000 / (8 * width) / mclk_freq; - us_video = vpm_us + us_m + us_n + us_p + video_fill_us; - vlwm = us_video * video_drain_rate/(1000*1000); - vlwm++; - vbs = 128; - if (vlwm > 128) vbs = 64; - if (vlwm > (256-64)) vbs = 32; - if (nvclk_freq * 2 > mclk_freq * width) - video_fill_us = vbs *1000*1000/ 16 / nvclk_freq ; - else - video_fill_us = vbs*1000*1000 / (8 * width) / mclk_freq; - cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; - us_crt = - us_video - +video_fill_us - +cpm_us - +us_m + us_n +us_p - ; - clwm = us_crt * crtc_drain_rate/(1000*1000); - clwm++; - } - else - { - crtc_drain_rate = pclk_freq * bpp/8; - crtpagemiss = 2; - crtpagemiss += 1; - cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; - us_crt = cpm_us + us_m + us_n + us_p ; - clwm = us_crt * crtc_drain_rate/(1000*1000); - clwm++; - } - m1 = clwm + cbs - 512; - p1 = m1 * pclk_freq / mclk_freq; - p1 = p1 * bpp / 8; - if ((p1 < m1) && (m1 > 0)) - { - fifo->valid = 0; - found = 0; - if (mclk_extra ==0) found = 1; - mclk_extra--; - } - else if (video_enable) - { - if ((clwm > 511) || (vlwm > 255)) - { - fifo->valid = 0; - found = 0; - if (mclk_extra ==0) found = 1; - mclk_extra--; - } - } - else - { - if (clwm > 519) - { - fifo->valid = 0; - found = 0; - if (mclk_extra ==0) found = 1; - mclk_extra--; - } - } - craw = clwm; - vraw = vlwm; - if (clwm < 384) clwm = 384; - if (vlwm < 128) vlwm = 128; - data = (int)(clwm); - fifo->graphics_lwm = data; - fifo->graphics_burst_size = 128; - data = (int)((vlwm+15)); - fifo->video_lwm = data; - fifo->video_burst_size = vbs; - } -} -static void nv4UpdateArbitrationSettings -( - unsigned VClk, - unsigned pixelDepth, - unsigned *burst, - unsigned *lwm, - RIVA_HW_INST *chip -) -{ - nv4_fifo_info fifo_data; - nv4_sim_state sim_data; - unsigned int M, N, P, pll, MClk, NVClk, cfg1; - - pll = NV_RD32(&chip->PRAMDAC0[0x00000504/4], 0); - M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; - MClk = (N * chip->CrystalFreqKHz / M) >> P; - pll = NV_RD32(&chip->PRAMDAC0[0x00000500/4], 0); - M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; - NVClk = (N * chip->CrystalFreqKHz / M) >> P; - cfg1 = NV_RD32(&chip->PFB[0x00000204/4], 0); - sim_data.pix_bpp = (char)pixelDepth; - sim_data.enable_video = 0; - sim_data.enable_mp = 0; - sim_data.memory_width = (NV_RD32(&chip->PEXTDEV[0x00000000/4], 0) & 0x10) ? - 128 : 64; - sim_data.mem_latency = (char)cfg1 & 0x0F; - sim_data.mem_aligned = 1; - sim_data.mem_page_miss = (char)(((cfg1 >> 4) &0x0F) + ((cfg1 >> 31) & 0x01)); - sim_data.gr_during_vid = 0; - sim_data.pclk_khz = VClk; - sim_data.mclk_khz = MClk; - sim_data.nvclk_khz = NVClk; - nv4CalcArbitration(&fifo_data, &sim_data); - if (fifo_data.valid) - { - int b = fifo_data.graphics_burst_size >> 4; - *burst = 0; - while (b >>= 1) - (*burst)++; - *lwm = fifo_data.graphics_lwm >> 3; - } -} -static void nv10CalcArbitration -( - nv10_fifo_info *fifo, - nv10_sim_state *arb -) -{ - int data, pagemiss, cas,width, video_enable, color_key_enable, bpp, align; - int nvclks, mclks, pclks, vpagemiss, crtpagemiss, vbs; - int nvclk_fill, us_extra; - int found, mclk_extra, mclk_loop, cbs, m1; - int mclk_freq, pclk_freq, nvclk_freq, mp_enable; - int us_m, us_m_min, us_n, us_p, video_drain_rate, crtc_drain_rate; - int vus_m, vus_n, vus_p; - int vpm_us, us_video, vlwm, cpm_us, us_crt,clwm; - int clwm_rnd_down; - int craw, m2us, us_pipe, us_pipe_min, vus_pipe, p1clk, p2; - int pclks_2_top_fifo, min_mclk_extra; - int us_min_mclk_extra; - - fifo->valid = 1; - pclk_freq = arb->pclk_khz; /* freq in KHz */ - mclk_freq = arb->mclk_khz; - nvclk_freq = arb->nvclk_khz; - pagemiss = arb->mem_page_miss; - cas = arb->mem_latency; - width = arb->memory_width/64; - video_enable = arb->enable_video; - color_key_enable = arb->gr_during_vid; - bpp = arb->pix_bpp; - align = arb->mem_aligned; - mp_enable = arb->enable_mp; - clwm = 0; - vlwm = 1024; - - cbs = 512; - vbs = 512; - - pclks = 4; /* lwm detect. */ - - nvclks = 3; /* lwm -> sync. */ - nvclks += 2; /* fbi bus cycles (1 req + 1 busy) */ - - mclks = 1; /* 2 edge sync. may be very close to edge so just put one. */ - - mclks += 1; /* arb_hp_req */ - mclks += 5; /* ap_hp_req tiling pipeline */ - - mclks += 2; /* tc_req latency fifo */ - mclks += 2; /* fb_cas_n_ memory request to fbio block */ - mclks += 7; /* sm_d_rdv data returned from fbio block */ - - /* fb.rd.d.Put_gc need to accumulate 256 bits for read */ - if (arb->memory_type == 0) - if (arb->memory_width == 64) /* 64 bit bus */ - mclks += 4; - else - mclks += 2; - else - if (arb->memory_width == 64) /* 64 bit bus */ - mclks += 2; - else - mclks += 1; - - if ((!video_enable) && (arb->memory_width == 128)) - { - mclk_extra = (bpp == 32) ? 31 : 42; /* Margin of error */ - min_mclk_extra = 17; - } - else - { - mclk_extra = (bpp == 32) ? 8 : 4; /* Margin of error */ - /* mclk_extra = 4; */ /* Margin of error */ - min_mclk_extra = 18; - } - - nvclks += 1; /* 2 edge sync. may be very close to edge so just put one. */ - nvclks += 1; /* fbi_d_rdv_n */ - nvclks += 1; /* Fbi_d_rdata */ - nvclks += 1; /* crtfifo load */ - - if(mp_enable) - mclks+=4; /* Mp can get in with a burst of 8. */ - /* Extra clocks determined by heuristics */ - - nvclks += 0; - pclks += 0; - found = 0; - while(found != 1) { - fifo->valid = 1; - found = 1; - mclk_loop = mclks+mclk_extra; - us_m = mclk_loop *1000*1000 / mclk_freq; /* Mclk latency in us */ - us_m_min = mclks * 1000*1000 / mclk_freq; /* Minimum Mclk latency in us */ - us_min_mclk_extra = min_mclk_extra *1000*1000 / mclk_freq; - us_n = nvclks*1000*1000 / nvclk_freq;/* nvclk latency in us */ - us_p = pclks*1000*1000 / pclk_freq;/* nvclk latency in us */ - us_pipe = us_m + us_n + us_p; - us_pipe_min = us_m_min + us_n + us_p; - us_extra = 0; - - vus_m = mclk_loop *1000*1000 / mclk_freq; /* Mclk latency in us */ - vus_n = (4)*1000*1000 / nvclk_freq;/* nvclk latency in us */ - vus_p = 0*1000*1000 / pclk_freq;/* pclk latency in us */ - vus_pipe = vus_m + vus_n + vus_p; - - if(video_enable) { - video_drain_rate = pclk_freq * 4; /* MB/s */ - crtc_drain_rate = pclk_freq * bpp/8; /* MB/s */ - - vpagemiss = 1; /* self generating page miss */ - vpagemiss += 1; /* One higher priority before */ - - crtpagemiss = 2; /* self generating page miss */ - if(mp_enable) - crtpagemiss += 1; /* if MA0 conflict */ - - vpm_us = (vpagemiss * pagemiss)*1000*1000/mclk_freq; - - us_video = vpm_us + vus_m; /* Video has separate read return path */ - - cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; - us_crt = - us_video /* Wait for video */ - +cpm_us /* CRT Page miss */ - +us_m + us_n +us_p /* other latency */ - ; - - clwm = us_crt * crtc_drain_rate/(1000*1000); - clwm++; /* fixed point <= float_point - 1. Fixes that */ - } else { - crtc_drain_rate = pclk_freq * bpp/8; /* bpp * pclk/8 */ - - crtpagemiss = 1; /* self generating page miss */ - crtpagemiss += 1; /* MA0 page miss */ - if(mp_enable) - crtpagemiss += 1; /* if MA0 conflict */ - cpm_us = crtpagemiss * pagemiss *1000*1000/ mclk_freq; - us_crt = cpm_us + us_m + us_n + us_p ; - clwm = us_crt * crtc_drain_rate/(1000*1000); - clwm++; /* fixed point <= float_point - 1. Fixes that */ - - /* - // - // Another concern, only for high pclks so don't do this - // with video: - // What happens if the latency to fetch the cbs is so large that - // fifo empties. In that case we need to have an alternate clwm value - // based off the total burst fetch - // - us_crt = (cbs * 1000 * 1000)/ (8*width)/mclk_freq ; - us_crt = us_crt + us_m + us_n + us_p + (4 * 1000 * 1000)/mclk_freq; - clwm_mt = us_crt * crtc_drain_rate/(1000*1000); - clwm_mt ++; - if(clwm_mt > clwm) - clwm = clwm_mt; - */ - /* Finally, a heuristic check when width == 64 bits */ - if(width == 1){ - nvclk_fill = nvclk_freq * 8; - if(crtc_drain_rate * 100 >= nvclk_fill * 102) - clwm = 0xfff; /*Large number to fail */ - - else if(crtc_drain_rate * 100 >= nvclk_fill * 98) { - clwm = 1024; - cbs = 512; - us_extra = (cbs * 1000 * 1000)/ (8*width)/mclk_freq ; - } - } - } - - - /* - Overfill check: - - */ - - clwm_rnd_down = ((int)clwm/8)*8; - if (clwm_rnd_down < clwm) - clwm += 8; - - m1 = clwm + cbs - 1024; /* Amount of overfill */ - m2us = us_pipe_min + us_min_mclk_extra; - pclks_2_top_fifo = (1024-clwm)/(8*width); - - /* pclk cycles to drain */ - p1clk = m2us * pclk_freq/(1000*1000); - p2 = p1clk * bpp / 8; /* bytes drained. */ - - if((p2 < m1) && (m1 > 0)) { - fifo->valid = 0; - found = 0; - if(min_mclk_extra == 0) { - if(cbs <= 32) { - found = 1; /* Can't adjust anymore! */ - } else { - cbs = cbs/2; /* reduce the burst size */ - } - } else { - min_mclk_extra--; - } - } else { - if (clwm > 1023){ /* Have some margin */ - fifo->valid = 0; - found = 0; - if(min_mclk_extra == 0) - found = 1; /* Can't adjust anymore! */ - else - min_mclk_extra--; - } - } - craw = clwm; - - if(clwm < (1024-cbs+8)) clwm = 1024-cbs+8; - data = (int)(clwm); - /* printf("CRT LWM: %f bytes, prog: 0x%x, bs: 256\n", clwm, data ); */ - fifo->graphics_lwm = data; fifo->graphics_burst_size = cbs; - - /* printf("VID LWM: %f bytes, prog: 0x%x, bs: %d\n, ", vlwm, data, vbs ); */ - fifo->video_lwm = 1024; fifo->video_burst_size = 512; - } -} -static void nv10UpdateArbitrationSettings -( - unsigned VClk, - unsigned pixelDepth, - unsigned *burst, - unsigned *lwm, - RIVA_HW_INST *chip -) -{ - nv10_fifo_info fifo_data; - nv10_sim_state sim_data; - unsigned int M, N, P, pll, MClk, NVClk, cfg1; - - pll = NV_RD32(&chip->PRAMDAC0[0x00000504/4], 0); - M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; - MClk = (N * chip->CrystalFreqKHz / M) >> P; - pll = NV_RD32(&chip->PRAMDAC0[0x00000500/4], 0); - M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; - NVClk = (N * chip->CrystalFreqKHz / M) >> P; - cfg1 = NV_RD32(&chip->PFB[0x00000204/4], 0); - sim_data.pix_bpp = (char)pixelDepth; - sim_data.enable_video = 0; - sim_data.enable_mp = 0; - sim_data.memory_type = (NV_RD32(&chip->PFB[0x00000200/4], 0) & 0x01) ? - 1 : 0; - sim_data.memory_width = (NV_RD32(&chip->PEXTDEV[0x00000000/4], 0) & 0x10) ? - 128 : 64; - sim_data.mem_latency = (char)cfg1 & 0x0F; - sim_data.mem_aligned = 1; - sim_data.mem_page_miss = (char)(((cfg1 >> 4) &0x0F) + ((cfg1 >> 31) & 0x01)); - sim_data.gr_during_vid = 0; - sim_data.pclk_khz = VClk; - sim_data.mclk_khz = MClk; - sim_data.nvclk_khz = NVClk; - nv10CalcArbitration(&fifo_data, &sim_data); - if (fifo_data.valid) - { - int b = fifo_data.graphics_burst_size >> 4; - *burst = 0; - while (b >>= 1) - (*burst)++; - *lwm = fifo_data.graphics_lwm >> 3; - } -} - -static void nForceUpdateArbitrationSettings -( - unsigned VClk, - unsigned pixelDepth, - unsigned *burst, - unsigned *lwm, - RIVA_HW_INST *chip, - struct pci_dev *pdev -) -{ - nv10_fifo_info fifo_data; - nv10_sim_state sim_data; - unsigned int M, N, P, pll, MClk, NVClk; - unsigned int uMClkPostDiv; - struct pci_dev *dev; - int domain = pci_domain_nr(pdev->bus); - - dev = pci_get_domain_bus_and_slot(domain, 0, 3); - pci_read_config_dword(dev, 0x6C, &uMClkPostDiv); - pci_dev_put(dev); - uMClkPostDiv = (uMClkPostDiv >> 8) & 0xf; - - if(!uMClkPostDiv) uMClkPostDiv = 4; - MClk = 400000 / uMClkPostDiv; - - pll = NV_RD32(&chip->PRAMDAC0[0x00000500/4], 0); - M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F; - NVClk = (N * chip->CrystalFreqKHz / M) >> P; - sim_data.pix_bpp = (char)pixelDepth; - sim_data.enable_video = 0; - sim_data.enable_mp = 0; - - dev = pci_get_domain_bus_and_slot(domain, 0, 1); - pci_read_config_dword(dev, 0x7C, &sim_data.memory_type); - pci_dev_put(dev); - sim_data.memory_type = (sim_data.memory_type >> 12) & 1; - - sim_data.memory_width = 64; - sim_data.mem_latency = 3; - sim_data.mem_aligned = 1; - sim_data.mem_page_miss = 10; - sim_data.gr_during_vid = 0; - sim_data.pclk_khz = VClk; - sim_data.mclk_khz = MClk; - sim_data.nvclk_khz = NVClk; - nv10CalcArbitration(&fifo_data, &sim_data); - if (fifo_data.valid) - { - int b = fifo_data.graphics_burst_size >> 4; - *burst = 0; - while (b >>= 1) - (*burst)++; - *lwm = fifo_data.graphics_lwm >> 3; - } -} - -/****************************************************************************\ -* * -* RIVA Mode State Routines * -* * -\****************************************************************************/ - -/* - * Calculate the Video Clock parameters for the PLL. - */ -static int CalcVClock -( - int clockIn, - int *clockOut, - int *mOut, - int *nOut, - int *pOut, - RIVA_HW_INST *chip -) -{ - unsigned lowM, highM, highP; - unsigned DeltaNew, DeltaOld; - unsigned VClk, Freq; - unsigned M, N, P; - - DeltaOld = 0xFFFFFFFF; - - VClk = (unsigned)clockIn; - - if (chip->CrystalFreqKHz == 13500) - { - lowM = 7; - highM = 13 - (chip->Architecture == NV_ARCH_03); - } - else - { - lowM = 8; - highM = 14 - (chip->Architecture == NV_ARCH_03); - } - - highP = 4 - (chip->Architecture == NV_ARCH_03); - for (P = 0; P <= highP; P ++) - { - Freq = VClk << P; - if ((Freq >= 128000) && (Freq <= chip->MaxVClockFreqKHz)) - { - for (M = lowM; M <= highM; M++) - { - N = (VClk << P) * M / chip->CrystalFreqKHz; - if(N <= 255) { - Freq = (chip->CrystalFreqKHz * N / M) >> P; - if (Freq > VClk) - DeltaNew = Freq - VClk; - else - DeltaNew = VClk - Freq; - if (DeltaNew < DeltaOld) - { - *mOut = M; - *nOut = N; - *pOut = P; - *clockOut = Freq; - DeltaOld = DeltaNew; - } - } - } - } - } - - /* non-zero: M/N/P/clock values assigned. zero: error (not set) */ - return (DeltaOld != 0xFFFFFFFF); -} -/* - * Calculate extended mode parameters (SVGA) and save in a - * mode state structure. - */ -int CalcStateExt -( - RIVA_HW_INST *chip, - RIVA_HW_STATE *state, - struct pci_dev *pdev, - int bpp, - int width, - int hDisplaySize, - int height, - int dotClock -) -{ - int pixelDepth; - int VClk, m, n, p; - - /* - * Save mode parameters. - */ - state->bpp = bpp; /* this is not bitsPerPixel, it's 8,15,16,32 */ - state->width = width; - state->height = height; - /* - * Extended RIVA registers. - */ - pixelDepth = (bpp + 1)/8; - if (!CalcVClock(dotClock, &VClk, &m, &n, &p, chip)) - return -EINVAL; - - switch (chip->Architecture) - { - case NV_ARCH_03: - nv3UpdateArbitrationSettings(VClk, - pixelDepth * 8, - &(state->arbitration0), - &(state->arbitration1), - chip); - state->cursor0 = 0x00; - state->cursor1 = 0x78; - state->cursor2 = 0x00000000; - state->pllsel = 0x10010100; - state->config = ((width + 31)/32) - | (((pixelDepth > 2) ? 3 : pixelDepth) << 8) - | 0x1000; - state->general = 0x00100100; - state->repaint1 = hDisplaySize < 1280 ? 0x06 : 0x02; - break; - case NV_ARCH_04: - nv4UpdateArbitrationSettings(VClk, - pixelDepth * 8, - &(state->arbitration0), - &(state->arbitration1), - chip); - state->cursor0 = 0x00; - state->cursor1 = 0xFC; - state->cursor2 = 0x00000000; - state->pllsel = 0x10000700; - state->config = 0x00001114; - state->general = bpp == 16 ? 0x00101100 : 0x00100100; - state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; - break; - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - if((chip->Chipset == NV_CHIP_IGEFORCE2) || - (chip->Chipset == NV_CHIP_0x01F0)) - { - nForceUpdateArbitrationSettings(VClk, - pixelDepth * 8, - &(state->arbitration0), - &(state->arbitration1), - chip, pdev); - } else { - nv10UpdateArbitrationSettings(VClk, - pixelDepth * 8, - &(state->arbitration0), - &(state->arbitration1), - chip); - } - state->cursor0 = 0x80 | (chip->CursorStart >> 17); - state->cursor1 = (chip->CursorStart >> 11) << 2; - state->cursor2 = chip->CursorStart >> 24; - state->pllsel = 0x10000700; - state->config = NV_RD32(&chip->PFB[0x00000200/4], 0); - state->general = bpp == 16 ? 0x00101100 : 0x00100100; - state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; - break; - } - - /* Paul Richards: below if block borks things in kernel for some reason */ - /* Tony: Below is needed to set hardware in DirectColor */ - if((bpp != 8) && (chip->Architecture != NV_ARCH_03)) - state->general |= 0x00000030; - - state->vpll = (p << 16) | (n << 8) | m; - state->repaint0 = (((width/8)*pixelDepth) & 0x700) >> 3; - state->pixel = pixelDepth > 2 ? 3 : pixelDepth; - state->offset0 = - state->offset1 = - state->offset2 = - state->offset3 = 0; - state->pitch0 = - state->pitch1 = - state->pitch2 = - state->pitch3 = pixelDepth * width; - - return 0; -} -/* - * Load fixed function state and pre-calculated/stored state. - */ -#define LOAD_FIXED_STATE(tbl,dev) \ - for (i = 0; i < sizeof(tbl##Table##dev)/8; i++) \ - NV_WR32(&chip->dev[tbl##Table##dev[i][0]], 0, tbl##Table##dev[i][1]) -#define LOAD_FIXED_STATE_8BPP(tbl,dev) \ - for (i = 0; i < sizeof(tbl##Table##dev##_8BPP)/8; i++) \ - NV_WR32(&chip->dev[tbl##Table##dev##_8BPP[i][0]], 0, tbl##Table##dev##_8BPP[i][1]) -#define LOAD_FIXED_STATE_15BPP(tbl,dev) \ - for (i = 0; i < sizeof(tbl##Table##dev##_15BPP)/8; i++) \ - NV_WR32(&chip->dev[tbl##Table##dev##_15BPP[i][0]], 0, tbl##Table##dev##_15BPP[i][1]) -#define LOAD_FIXED_STATE_16BPP(tbl,dev) \ - for (i = 0; i < sizeof(tbl##Table##dev##_16BPP)/8; i++) \ - NV_WR32(&chip->dev[tbl##Table##dev##_16BPP[i][0]], 0, tbl##Table##dev##_16BPP[i][1]) -#define LOAD_FIXED_STATE_32BPP(tbl,dev) \ - for (i = 0; i < sizeof(tbl##Table##dev##_32BPP)/8; i++) \ - NV_WR32(&chip->dev[tbl##Table##dev##_32BPP[i][0]], 0, tbl##Table##dev##_32BPP[i][1]) - -static void UpdateFifoState -( - RIVA_HW_INST *chip -) -{ - int i; - - switch (chip->Architecture) - { - case NV_ARCH_04: - LOAD_FIXED_STATE(nv4,FIFO); - chip->Tri03 = NULL; - chip->Tri05 = (RivaTexturedTriangle05 __iomem *)&(chip->FIFO[0x0000E000/4]); - break; - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - /* - * Initialize state for the RivaTriangle3D05 routines. - */ - LOAD_FIXED_STATE(nv10tri05,PGRAPH); - LOAD_FIXED_STATE(nv10,FIFO); - chip->Tri03 = NULL; - chip->Tri05 = (RivaTexturedTriangle05 __iomem *)&(chip->FIFO[0x0000E000/4]); - break; - } -} -static void LoadStateExt -( - RIVA_HW_INST *chip, - RIVA_HW_STATE *state -) -{ - int i; - - /* - * Load HW fixed function state. - */ - LOAD_FIXED_STATE(Riva,PMC); - LOAD_FIXED_STATE(Riva,PTIMER); - switch (chip->Architecture) - { - case NV_ARCH_03: - /* - * Make sure frame buffer config gets set before loading PRAMIN. - */ - NV_WR32(chip->PFB, 0x00000200, state->config); - LOAD_FIXED_STATE(nv3,PFIFO); - LOAD_FIXED_STATE(nv3,PRAMIN); - LOAD_FIXED_STATE(nv3,PGRAPH); - switch (state->bpp) - { - case 15: - case 16: - LOAD_FIXED_STATE_15BPP(nv3,PRAMIN); - LOAD_FIXED_STATE_15BPP(nv3,PGRAPH); - chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); - break; - case 24: - case 32: - LOAD_FIXED_STATE_32BPP(nv3,PRAMIN); - LOAD_FIXED_STATE_32BPP(nv3,PGRAPH); - chip->Tri03 = NULL; - break; - case 8: - default: - LOAD_FIXED_STATE_8BPP(nv3,PRAMIN); - LOAD_FIXED_STATE_8BPP(nv3,PGRAPH); - chip->Tri03 = NULL; - break; - } - for (i = 0x00000; i < 0x00800; i++) - NV_WR32(&chip->PRAMIN[0x00000502 + i], 0, (i << 12) | 0x03); - NV_WR32(chip->PGRAPH, 0x00000630, state->offset0); - NV_WR32(chip->PGRAPH, 0x00000634, state->offset1); - NV_WR32(chip->PGRAPH, 0x00000638, state->offset2); - NV_WR32(chip->PGRAPH, 0x0000063C, state->offset3); - NV_WR32(chip->PGRAPH, 0x00000650, state->pitch0); - NV_WR32(chip->PGRAPH, 0x00000654, state->pitch1); - NV_WR32(chip->PGRAPH, 0x00000658, state->pitch2); - NV_WR32(chip->PGRAPH, 0x0000065C, state->pitch3); - break; - case NV_ARCH_04: - /* - * Make sure frame buffer config gets set before loading PRAMIN. - */ - NV_WR32(chip->PFB, 0x00000200, state->config); - LOAD_FIXED_STATE(nv4,PFIFO); - LOAD_FIXED_STATE(nv4,PRAMIN); - LOAD_FIXED_STATE(nv4,PGRAPH); - switch (state->bpp) - { - case 15: - LOAD_FIXED_STATE_15BPP(nv4,PRAMIN); - LOAD_FIXED_STATE_15BPP(nv4,PGRAPH); - chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); - break; - case 16: - LOAD_FIXED_STATE_16BPP(nv4,PRAMIN); - LOAD_FIXED_STATE_16BPP(nv4,PGRAPH); - chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); - break; - case 24: - case 32: - LOAD_FIXED_STATE_32BPP(nv4,PRAMIN); - LOAD_FIXED_STATE_32BPP(nv4,PGRAPH); - chip->Tri03 = NULL; - break; - case 8: - default: - LOAD_FIXED_STATE_8BPP(nv4,PRAMIN); - LOAD_FIXED_STATE_8BPP(nv4,PGRAPH); - chip->Tri03 = NULL; - break; - } - NV_WR32(chip->PGRAPH, 0x00000640, state->offset0); - NV_WR32(chip->PGRAPH, 0x00000644, state->offset1); - NV_WR32(chip->PGRAPH, 0x00000648, state->offset2); - NV_WR32(chip->PGRAPH, 0x0000064C, state->offset3); - NV_WR32(chip->PGRAPH, 0x00000670, state->pitch0); - NV_WR32(chip->PGRAPH, 0x00000674, state->pitch1); - NV_WR32(chip->PGRAPH, 0x00000678, state->pitch2); - NV_WR32(chip->PGRAPH, 0x0000067C, state->pitch3); - break; - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - if(chip->twoHeads) { - VGA_WR08(chip->PCIO, 0x03D4, 0x44); - VGA_WR08(chip->PCIO, 0x03D5, state->crtcOwner); - chip->LockUnlock(chip, 0); - } - - LOAD_FIXED_STATE(nv10,PFIFO); - LOAD_FIXED_STATE(nv10,PRAMIN); - LOAD_FIXED_STATE(nv10,PGRAPH); - switch (state->bpp) - { - case 15: - LOAD_FIXED_STATE_15BPP(nv10,PRAMIN); - LOAD_FIXED_STATE_15BPP(nv10,PGRAPH); - chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); - break; - case 16: - LOAD_FIXED_STATE_16BPP(nv10,PRAMIN); - LOAD_FIXED_STATE_16BPP(nv10,PGRAPH); - chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); - break; - case 24: - case 32: - LOAD_FIXED_STATE_32BPP(nv10,PRAMIN); - LOAD_FIXED_STATE_32BPP(nv10,PGRAPH); - chip->Tri03 = NULL; - break; - case 8: - default: - LOAD_FIXED_STATE_8BPP(nv10,PRAMIN); - LOAD_FIXED_STATE_8BPP(nv10,PGRAPH); - chip->Tri03 = NULL; - break; - } - - if(chip->Architecture == NV_ARCH_10) { - NV_WR32(chip->PGRAPH, 0x00000640, state->offset0); - NV_WR32(chip->PGRAPH, 0x00000644, state->offset1); - NV_WR32(chip->PGRAPH, 0x00000648, state->offset2); - NV_WR32(chip->PGRAPH, 0x0000064C, state->offset3); - NV_WR32(chip->PGRAPH, 0x00000670, state->pitch0); - NV_WR32(chip->PGRAPH, 0x00000674, state->pitch1); - NV_WR32(chip->PGRAPH, 0x00000678, state->pitch2); - NV_WR32(chip->PGRAPH, 0x0000067C, state->pitch3); - NV_WR32(chip->PGRAPH, 0x00000680, state->pitch3); - } else { - NV_WR32(chip->PGRAPH, 0x00000820, state->offset0); - NV_WR32(chip->PGRAPH, 0x00000824, state->offset1); - NV_WR32(chip->PGRAPH, 0x00000828, state->offset2); - NV_WR32(chip->PGRAPH, 0x0000082C, state->offset3); - NV_WR32(chip->PGRAPH, 0x00000850, state->pitch0); - NV_WR32(chip->PGRAPH, 0x00000854, state->pitch1); - NV_WR32(chip->PGRAPH, 0x00000858, state->pitch2); - NV_WR32(chip->PGRAPH, 0x0000085C, state->pitch3); - NV_WR32(chip->PGRAPH, 0x00000860, state->pitch3); - NV_WR32(chip->PGRAPH, 0x00000864, state->pitch3); - NV_WR32(chip->PGRAPH, 0x000009A4, NV_RD32(chip->PFB, 0x00000200)); - NV_WR32(chip->PGRAPH, 0x000009A8, NV_RD32(chip->PFB, 0x00000204)); - } - if(chip->twoHeads) { - NV_WR32(chip->PCRTC0, 0x00000860, state->head); - NV_WR32(chip->PCRTC0, 0x00002860, state->head2); - } - NV_WR32(chip->PRAMDAC, 0x00000404, NV_RD32(chip->PRAMDAC, 0x00000404) | (1 << 25)); - - NV_WR32(chip->PMC, 0x00008704, 1); - NV_WR32(chip->PMC, 0x00008140, 0); - NV_WR32(chip->PMC, 0x00008920, 0); - NV_WR32(chip->PMC, 0x00008924, 0); - NV_WR32(chip->PMC, 0x00008908, 0x01ffffff); - NV_WR32(chip->PMC, 0x0000890C, 0x01ffffff); - NV_WR32(chip->PMC, 0x00001588, 0); - - NV_WR32(chip->PFB, 0x00000240, 0); - NV_WR32(chip->PFB, 0x00000250, 0); - NV_WR32(chip->PFB, 0x00000260, 0); - NV_WR32(chip->PFB, 0x00000270, 0); - NV_WR32(chip->PFB, 0x00000280, 0); - NV_WR32(chip->PFB, 0x00000290, 0); - NV_WR32(chip->PFB, 0x000002A0, 0); - NV_WR32(chip->PFB, 0x000002B0, 0); - - NV_WR32(chip->PGRAPH, 0x00000B00, NV_RD32(chip->PFB, 0x00000240)); - NV_WR32(chip->PGRAPH, 0x00000B04, NV_RD32(chip->PFB, 0x00000244)); - NV_WR32(chip->PGRAPH, 0x00000B08, NV_RD32(chip->PFB, 0x00000248)); - NV_WR32(chip->PGRAPH, 0x00000B0C, NV_RD32(chip->PFB, 0x0000024C)); - NV_WR32(chip->PGRAPH, 0x00000B10, NV_RD32(chip->PFB, 0x00000250)); - NV_WR32(chip->PGRAPH, 0x00000B14, NV_RD32(chip->PFB, 0x00000254)); - NV_WR32(chip->PGRAPH, 0x00000B18, NV_RD32(chip->PFB, 0x00000258)); - NV_WR32(chip->PGRAPH, 0x00000B1C, NV_RD32(chip->PFB, 0x0000025C)); - NV_WR32(chip->PGRAPH, 0x00000B20, NV_RD32(chip->PFB, 0x00000260)); - NV_WR32(chip->PGRAPH, 0x00000B24, NV_RD32(chip->PFB, 0x00000264)); - NV_WR32(chip->PGRAPH, 0x00000B28, NV_RD32(chip->PFB, 0x00000268)); - NV_WR32(chip->PGRAPH, 0x00000B2C, NV_RD32(chip->PFB, 0x0000026C)); - NV_WR32(chip->PGRAPH, 0x00000B30, NV_RD32(chip->PFB, 0x00000270)); - NV_WR32(chip->PGRAPH, 0x00000B34, NV_RD32(chip->PFB, 0x00000274)); - NV_WR32(chip->PGRAPH, 0x00000B38, NV_RD32(chip->PFB, 0x00000278)); - NV_WR32(chip->PGRAPH, 0x00000B3C, NV_RD32(chip->PFB, 0x0000027C)); - NV_WR32(chip->PGRAPH, 0x00000B40, NV_RD32(chip->PFB, 0x00000280)); - NV_WR32(chip->PGRAPH, 0x00000B44, NV_RD32(chip->PFB, 0x00000284)); - NV_WR32(chip->PGRAPH, 0x00000B48, NV_RD32(chip->PFB, 0x00000288)); - NV_WR32(chip->PGRAPH, 0x00000B4C, NV_RD32(chip->PFB, 0x0000028C)); - NV_WR32(chip->PGRAPH, 0x00000B50, NV_RD32(chip->PFB, 0x00000290)); - NV_WR32(chip->PGRAPH, 0x00000B54, NV_RD32(chip->PFB, 0x00000294)); - NV_WR32(chip->PGRAPH, 0x00000B58, NV_RD32(chip->PFB, 0x00000298)); - NV_WR32(chip->PGRAPH, 0x00000B5C, NV_RD32(chip->PFB, 0x0000029C)); - NV_WR32(chip->PGRAPH, 0x00000B60, NV_RD32(chip->PFB, 0x000002A0)); - NV_WR32(chip->PGRAPH, 0x00000B64, NV_RD32(chip->PFB, 0x000002A4)); - NV_WR32(chip->PGRAPH, 0x00000B68, NV_RD32(chip->PFB, 0x000002A8)); - NV_WR32(chip->PGRAPH, 0x00000B6C, NV_RD32(chip->PFB, 0x000002AC)); - NV_WR32(chip->PGRAPH, 0x00000B70, NV_RD32(chip->PFB, 0x000002B0)); - NV_WR32(chip->PGRAPH, 0x00000B74, NV_RD32(chip->PFB, 0x000002B4)); - NV_WR32(chip->PGRAPH, 0x00000B78, NV_RD32(chip->PFB, 0x000002B8)); - NV_WR32(chip->PGRAPH, 0x00000B7C, NV_RD32(chip->PFB, 0x000002BC)); - NV_WR32(chip->PGRAPH, 0x00000F40, 0x10000000); - NV_WR32(chip->PGRAPH, 0x00000F44, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000040); - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000008); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000200); - for (i = 0; i < (3*16); i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000040); - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000800); - for (i = 0; i < (16*16); i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F40, 0x30000000); - NV_WR32(chip->PGRAPH, 0x00000F44, 0x00000004); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00006400); - for (i = 0; i < (59*4); i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00006800); - for (i = 0; i < (47*4); i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00006C00); - for (i = 0; i < (3*4); i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00007000); - for (i = 0; i < (19*4); i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00007400); - for (i = 0; i < (12*4); i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00007800); - for (i = 0; i < (12*4); i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00004400); - for (i = 0; i < (8*4); i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000000); - for (i = 0; i < 16; i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - NV_WR32(chip->PGRAPH, 0x00000F50, 0x00000040); - for (i = 0; i < 4; i++) - NV_WR32(chip->PGRAPH, 0x00000F54, 0x00000000); - - NV_WR32(chip->PCRTC, 0x00000810, state->cursorConfig); - - if(chip->flatPanel) { - if((chip->Chipset & 0x0ff0) == 0x0110) { - NV_WR32(chip->PRAMDAC, 0x0528, state->dither); - } else - if((chip->Chipset & 0x0ff0) >= 0x0170) { - NV_WR32(chip->PRAMDAC, 0x083C, state->dither); - } - - VGA_WR08(chip->PCIO, 0x03D4, 0x53); - VGA_WR08(chip->PCIO, 0x03D5, 0); - VGA_WR08(chip->PCIO, 0x03D4, 0x54); - VGA_WR08(chip->PCIO, 0x03D5, 0); - VGA_WR08(chip->PCIO, 0x03D4, 0x21); - VGA_WR08(chip->PCIO, 0x03D5, 0xfa); - } - - VGA_WR08(chip->PCIO, 0x03D4, 0x41); - VGA_WR08(chip->PCIO, 0x03D5, state->extra); - } - LOAD_FIXED_STATE(Riva,FIFO); - UpdateFifoState(chip); - /* - * Load HW mode state. - */ - VGA_WR08(chip->PCIO, 0x03D4, 0x19); - VGA_WR08(chip->PCIO, 0x03D5, state->repaint0); - VGA_WR08(chip->PCIO, 0x03D4, 0x1A); - VGA_WR08(chip->PCIO, 0x03D5, state->repaint1); - VGA_WR08(chip->PCIO, 0x03D4, 0x25); - VGA_WR08(chip->PCIO, 0x03D5, state->screen); - VGA_WR08(chip->PCIO, 0x03D4, 0x28); - VGA_WR08(chip->PCIO, 0x03D5, state->pixel); - VGA_WR08(chip->PCIO, 0x03D4, 0x2D); - VGA_WR08(chip->PCIO, 0x03D5, state->horiz); - VGA_WR08(chip->PCIO, 0x03D4, 0x1B); - VGA_WR08(chip->PCIO, 0x03D5, state->arbitration0); - VGA_WR08(chip->PCIO, 0x03D4, 0x20); - VGA_WR08(chip->PCIO, 0x03D5, state->arbitration1); - VGA_WR08(chip->PCIO, 0x03D4, 0x30); - VGA_WR08(chip->PCIO, 0x03D5, state->cursor0); - VGA_WR08(chip->PCIO, 0x03D4, 0x31); - VGA_WR08(chip->PCIO, 0x03D5, state->cursor1); - VGA_WR08(chip->PCIO, 0x03D4, 0x2F); - VGA_WR08(chip->PCIO, 0x03D5, state->cursor2); - VGA_WR08(chip->PCIO, 0x03D4, 0x39); - VGA_WR08(chip->PCIO, 0x03D5, state->interlace); - - if(!chip->flatPanel) { - NV_WR32(chip->PRAMDAC0, 0x00000508, state->vpll); - NV_WR32(chip->PRAMDAC0, 0x0000050C, state->pllsel); - if(chip->twoHeads) - NV_WR32(chip->PRAMDAC0, 0x00000520, state->vpll2); - } else { - NV_WR32(chip->PRAMDAC, 0x00000848 , state->scale); - } - NV_WR32(chip->PRAMDAC, 0x00000600 , state->general); - - /* - * Turn off VBlank enable and reset. - */ - NV_WR32(chip->PCRTC, 0x00000140, 0); - NV_WR32(chip->PCRTC, 0x00000100, chip->VBlankBit); - /* - * Set interrupt enable. - */ - NV_WR32(chip->PMC, 0x00000140, chip->EnableIRQ & 0x01); - /* - * Set current state pointer. - */ - chip->CurrentState = state; - /* - * Reset FIFO free and empty counts. - */ - chip->FifoFreeCount = 0; - /* Free count from first subchannel */ - chip->FifoEmptyCount = NV_RD32(&chip->Rop->FifoFree, 0); -} -static void UnloadStateExt -( - RIVA_HW_INST *chip, - RIVA_HW_STATE *state -) -{ - /* - * Save current HW state. - */ - VGA_WR08(chip->PCIO, 0x03D4, 0x19); - state->repaint0 = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x1A); - state->repaint1 = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x25); - state->screen = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x28); - state->pixel = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x2D); - state->horiz = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x1B); - state->arbitration0 = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x20); - state->arbitration1 = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x30); - state->cursor0 = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x31); - state->cursor1 = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x2F); - state->cursor2 = VGA_RD08(chip->PCIO, 0x03D5); - VGA_WR08(chip->PCIO, 0x03D4, 0x39); - state->interlace = VGA_RD08(chip->PCIO, 0x03D5); - state->vpll = NV_RD32(chip->PRAMDAC0, 0x00000508); - state->vpll2 = NV_RD32(chip->PRAMDAC0, 0x00000520); - state->pllsel = NV_RD32(chip->PRAMDAC0, 0x0000050C); - state->general = NV_RD32(chip->PRAMDAC, 0x00000600); - state->scale = NV_RD32(chip->PRAMDAC, 0x00000848); - state->config = NV_RD32(chip->PFB, 0x00000200); - switch (chip->Architecture) - { - case NV_ARCH_03: - state->offset0 = NV_RD32(chip->PGRAPH, 0x00000630); - state->offset1 = NV_RD32(chip->PGRAPH, 0x00000634); - state->offset2 = NV_RD32(chip->PGRAPH, 0x00000638); - state->offset3 = NV_RD32(chip->PGRAPH, 0x0000063C); - state->pitch0 = NV_RD32(chip->PGRAPH, 0x00000650); - state->pitch1 = NV_RD32(chip->PGRAPH, 0x00000654); - state->pitch2 = NV_RD32(chip->PGRAPH, 0x00000658); - state->pitch3 = NV_RD32(chip->PGRAPH, 0x0000065C); - break; - case NV_ARCH_04: - state->offset0 = NV_RD32(chip->PGRAPH, 0x00000640); - state->offset1 = NV_RD32(chip->PGRAPH, 0x00000644); - state->offset2 = NV_RD32(chip->PGRAPH, 0x00000648); - state->offset3 = NV_RD32(chip->PGRAPH, 0x0000064C); - state->pitch0 = NV_RD32(chip->PGRAPH, 0x00000670); - state->pitch1 = NV_RD32(chip->PGRAPH, 0x00000674); - state->pitch2 = NV_RD32(chip->PGRAPH, 0x00000678); - state->pitch3 = NV_RD32(chip->PGRAPH, 0x0000067C); - break; - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - state->offset0 = NV_RD32(chip->PGRAPH, 0x00000640); - state->offset1 = NV_RD32(chip->PGRAPH, 0x00000644); - state->offset2 = NV_RD32(chip->PGRAPH, 0x00000648); - state->offset3 = NV_RD32(chip->PGRAPH, 0x0000064C); - state->pitch0 = NV_RD32(chip->PGRAPH, 0x00000670); - state->pitch1 = NV_RD32(chip->PGRAPH, 0x00000674); - state->pitch2 = NV_RD32(chip->PGRAPH, 0x00000678); - state->pitch3 = NV_RD32(chip->PGRAPH, 0x0000067C); - if(chip->twoHeads) { - state->head = NV_RD32(chip->PCRTC0, 0x00000860); - state->head2 = NV_RD32(chip->PCRTC0, 0x00002860); - VGA_WR08(chip->PCIO, 0x03D4, 0x44); - state->crtcOwner = VGA_RD08(chip->PCIO, 0x03D5); - } - VGA_WR08(chip->PCIO, 0x03D4, 0x41); - state->extra = VGA_RD08(chip->PCIO, 0x03D5); - state->cursorConfig = NV_RD32(chip->PCRTC, 0x00000810); - - if((chip->Chipset & 0x0ff0) == 0x0110) { - state->dither = NV_RD32(chip->PRAMDAC, 0x0528); - } else - if((chip->Chipset & 0x0ff0) >= 0x0170) { - state->dither = NV_RD32(chip->PRAMDAC, 0x083C); - } - break; - } -} -static void SetStartAddress -( - RIVA_HW_INST *chip, - unsigned start -) -{ - NV_WR32(chip->PCRTC, 0x800, start); -} - -static void SetStartAddress3 -( - RIVA_HW_INST *chip, - unsigned start -) -{ - int offset = start >> 2; - int pan = (start & 3) << 1; - unsigned char tmp; - - /* - * Unlock extended registers. - */ - chip->LockUnlock(chip, 0); - /* - * Set start address. - */ - VGA_WR08(chip->PCIO, 0x3D4, 0x0D); VGA_WR08(chip->PCIO, 0x3D5, offset); - offset >>= 8; - VGA_WR08(chip->PCIO, 0x3D4, 0x0C); VGA_WR08(chip->PCIO, 0x3D5, offset); - offset >>= 8; - VGA_WR08(chip->PCIO, 0x3D4, 0x19); tmp = VGA_RD08(chip->PCIO, 0x3D5); - VGA_WR08(chip->PCIO, 0x3D5, (offset & 0x01F) | (tmp & ~0x1F)); - VGA_WR08(chip->PCIO, 0x3D4, 0x2D); tmp = VGA_RD08(chip->PCIO, 0x3D5); - VGA_WR08(chip->PCIO, 0x3D5, (offset & 0x60) | (tmp & ~0x60)); - /* - * 4 pixel pan register. - */ - offset = VGA_RD08(chip->PCIO, chip->IO + 0x0A); - VGA_WR08(chip->PCIO, 0x3C0, 0x13); - VGA_WR08(chip->PCIO, 0x3C0, pan); -} -static void nv3SetSurfaces2D -( - RIVA_HW_INST *chip, - unsigned surf0, - unsigned surf1 -) -{ - RivaSurface __iomem *Surface = - (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); - - RIVA_FIFO_FREE(*chip,Tri03,5); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000003); - NV_WR32(&Surface->Offset, 0, surf0); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000004); - NV_WR32(&Surface->Offset, 0, surf1); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000013); -} -static void nv4SetSurfaces2D -( - RIVA_HW_INST *chip, - unsigned surf0, - unsigned surf1 -) -{ - RivaSurface __iomem *Surface = - (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); - - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000003); - NV_WR32(&Surface->Offset, 0, surf0); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000004); - NV_WR32(&Surface->Offset, 0, surf1); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000014); -} -static void nv10SetSurfaces2D -( - RIVA_HW_INST *chip, - unsigned surf0, - unsigned surf1 -) -{ - RivaSurface __iomem *Surface = - (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); - - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000003); - NV_WR32(&Surface->Offset, 0, surf0); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000004); - NV_WR32(&Surface->Offset, 0, surf1); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000014); -} -static void nv3SetSurfaces3D -( - RIVA_HW_INST *chip, - unsigned surf0, - unsigned surf1 -) -{ - RivaSurface __iomem *Surface = - (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); - - RIVA_FIFO_FREE(*chip,Tri03,5); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000005); - NV_WR32(&Surface->Offset, 0, surf0); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000006); - NV_WR32(&Surface->Offset, 0, surf1); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000013); -} -static void nv4SetSurfaces3D -( - RIVA_HW_INST *chip, - unsigned surf0, - unsigned surf1 -) -{ - RivaSurface __iomem *Surface = - (RivaSurface __iomem *)&(chip->FIFO[0x0000E000/4]); - - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000005); - NV_WR32(&Surface->Offset, 0, surf0); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000006); - NV_WR32(&Surface->Offset, 0, surf1); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000014); -} -static void nv10SetSurfaces3D -( - RIVA_HW_INST *chip, - unsigned surf0, - unsigned surf1 -) -{ - RivaSurface3D __iomem *Surfaces3D = - (RivaSurface3D __iomem *)&(chip->FIFO[0x0000E000/4]); - - RIVA_FIFO_FREE(*chip,Tri03,4); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000007); - NV_WR32(&Surfaces3D->RenderBufferOffset, 0, surf0); - NV_WR32(&Surfaces3D->ZBufferOffset, 0, surf1); - NV_WR32(&chip->FIFO[0x00003800], 0, 0x80000014); -} - -/****************************************************************************\ -* * -* Probe RIVA Chip Configuration * -* * -\****************************************************************************/ - -static void nv3GetConfig -( - RIVA_HW_INST *chip -) -{ - /* - * Fill in chip configuration. - */ - if (NV_RD32(&chip->PFB[0x00000000/4], 0) & 0x00000020) - { - if (((NV_RD32(chip->PMC, 0x00000000) & 0xF0) == 0x20) - && ((NV_RD32(chip->PMC, 0x00000000) & 0x0F) >= 0x02)) - { - /* - * SDRAM 128 ZX. - */ - chip->RamBandwidthKBytesPerSec = 800000; - switch (NV_RD32(chip->PFB, 0x00000000) & 0x03) - { - case 2: - chip->RamAmountKBytes = 1024 * 4; - break; - case 1: - chip->RamAmountKBytes = 1024 * 2; - break; - default: - chip->RamAmountKBytes = 1024 * 8; - break; - } - } - else - { - chip->RamBandwidthKBytesPerSec = 1000000; - chip->RamAmountKBytes = 1024 * 8; - } - } - else - { - /* - * SGRAM 128. - */ - chip->RamBandwidthKBytesPerSec = 1000000; - switch (NV_RD32(chip->PFB, 0x00000000) & 0x00000003) - { - case 0: - chip->RamAmountKBytes = 1024 * 8; - break; - case 2: - chip->RamAmountKBytes = 1024 * 4; - break; - default: - chip->RamAmountKBytes = 1024 * 2; - break; - } - } - chip->CrystalFreqKHz = (NV_RD32(chip->PEXTDEV, 0x00000000) & 0x00000040) ? 14318 : 13500; - chip->CURSOR = &(chip->PRAMIN[0x00008000/4 - 0x0800/4]); - chip->VBlankBit = 0x00000100; - chip->MaxVClockFreqKHz = 256000; - /* - * Set chip functions. - */ - chip->Busy = nv3Busy; - chip->ShowHideCursor = ShowHideCursor; - chip->LoadStateExt = LoadStateExt; - chip->UnloadStateExt = UnloadStateExt; - chip->SetStartAddress = SetStartAddress3; - chip->SetSurfaces2D = nv3SetSurfaces2D; - chip->SetSurfaces3D = nv3SetSurfaces3D; - chip->LockUnlock = nv3LockUnlock; -} -static void nv4GetConfig -( - RIVA_HW_INST *chip -) -{ - /* - * Fill in chip configuration. - */ - if (NV_RD32(chip->PFB, 0x00000000) & 0x00000100) - { - chip->RamAmountKBytes = ((NV_RD32(chip->PFB, 0x00000000) >> 12) & 0x0F) * 1024 * 2 - + 1024 * 2; - } - else - { - switch (NV_RD32(chip->PFB, 0x00000000) & 0x00000003) - { - case 0: - chip->RamAmountKBytes = 1024 * 32; - break; - case 1: - chip->RamAmountKBytes = 1024 * 4; - break; - case 2: - chip->RamAmountKBytes = 1024 * 8; - break; - case 3: - default: - chip->RamAmountKBytes = 1024 * 16; - break; - } - } - switch ((NV_RD32(chip->PFB, 0x00000000) >> 3) & 0x00000003) - { - case 3: - chip->RamBandwidthKBytesPerSec = 800000; - break; - default: - chip->RamBandwidthKBytesPerSec = 1000000; - break; - } - chip->CrystalFreqKHz = (NV_RD32(chip->PEXTDEV, 0x00000000) & 0x00000040) ? 14318 : 13500; - chip->CURSOR = &(chip->PRAMIN[0x00010000/4 - 0x0800/4]); - chip->VBlankBit = 0x00000001; - chip->MaxVClockFreqKHz = 350000; - /* - * Set chip functions. - */ - chip->Busy = nv4Busy; - chip->ShowHideCursor = ShowHideCursor; - chip->LoadStateExt = LoadStateExt; - chip->UnloadStateExt = UnloadStateExt; - chip->SetStartAddress = SetStartAddress; - chip->SetSurfaces2D = nv4SetSurfaces2D; - chip->SetSurfaces3D = nv4SetSurfaces3D; - chip->LockUnlock = nv4LockUnlock; -} -static void nv10GetConfig -( - RIVA_HW_INST *chip, - struct pci_dev *pdev, - unsigned int chipset -) -{ - struct pci_dev* dev; - int domain = pci_domain_nr(pdev->bus); - u32 amt; - -#ifdef __BIG_ENDIAN - /* turn on big endian register access */ - if(!(NV_RD32(chip->PMC, 0x00000004) & 0x01000001)) - NV_WR32(chip->PMC, 0x00000004, 0x01000001); -#endif - - /* - * Fill in chip configuration. - */ - if(chipset == NV_CHIP_IGEFORCE2) { - dev = pci_get_domain_bus_and_slot(domain, 0, 1); - pci_read_config_dword(dev, 0x7C, &amt); - pci_dev_put(dev); - chip->RamAmountKBytes = (((amt >> 6) & 31) + 1) * 1024; - } else if(chipset == NV_CHIP_0x01F0) { - dev = pci_get_domain_bus_and_slot(domain, 0, 1); - pci_read_config_dword(dev, 0x84, &amt); - pci_dev_put(dev); - chip->RamAmountKBytes = (((amt >> 4) & 127) + 1) * 1024; - } else { - switch ((NV_RD32(chip->PFB, 0x0000020C) >> 20) & 0x000000FF) - { - case 0x02: - chip->RamAmountKBytes = 1024 * 2; - break; - case 0x04: - chip->RamAmountKBytes = 1024 * 4; - break; - case 0x08: - chip->RamAmountKBytes = 1024 * 8; - break; - case 0x10: - chip->RamAmountKBytes = 1024 * 16; - break; - case 0x20: - chip->RamAmountKBytes = 1024 * 32; - break; - case 0x40: - chip->RamAmountKBytes = 1024 * 64; - break; - case 0x80: - chip->RamAmountKBytes = 1024 * 128; - break; - default: - chip->RamAmountKBytes = 1024 * 16; - break; - } - } - switch ((NV_RD32(chip->PFB, 0x00000000) >> 3) & 0x00000003) - { - case 3: - chip->RamBandwidthKBytesPerSec = 800000; - break; - default: - chip->RamBandwidthKBytesPerSec = 1000000; - break; - } - chip->CrystalFreqKHz = (NV_RD32(chip->PEXTDEV, 0x0000) & (1 << 6)) ? - 14318 : 13500; - - switch (chipset & 0x0ff0) { - case 0x0170: - case 0x0180: - case 0x01F0: - case 0x0250: - case 0x0280: - case 0x0300: - case 0x0310: - case 0x0320: - case 0x0330: - case 0x0340: - if(NV_RD32(chip->PEXTDEV, 0x0000) & (1 << 22)) - chip->CrystalFreqKHz = 27000; - break; - default: - break; - } - - chip->CursorStart = (chip->RamAmountKBytes - 128) * 1024; - chip->CURSOR = NULL; /* can't set this here */ - chip->VBlankBit = 0x00000001; - chip->MaxVClockFreqKHz = 350000; - /* - * Set chip functions. - */ - chip->Busy = nv10Busy; - chip->ShowHideCursor = ShowHideCursor; - chip->LoadStateExt = LoadStateExt; - chip->UnloadStateExt = UnloadStateExt; - chip->SetStartAddress = SetStartAddress; - chip->SetSurfaces2D = nv10SetSurfaces2D; - chip->SetSurfaces3D = nv10SetSurfaces3D; - chip->LockUnlock = nv4LockUnlock; - - switch(chipset & 0x0ff0) { - case 0x0110: - case 0x0170: - case 0x0180: - case 0x01F0: - case 0x0250: - case 0x0280: - case 0x0300: - case 0x0310: - case 0x0320: - case 0x0330: - case 0x0340: - chip->twoHeads = TRUE; - break; - default: - chip->twoHeads = FALSE; - break; - } -} -int RivaGetConfig -( - RIVA_HW_INST *chip, - struct pci_dev *pdev, - unsigned int chipset -) -{ - /* - * Save this so future SW know whats it's dealing with. - */ - chip->Version = RIVA_SW_VERSION; - /* - * Chip specific configuration. - */ - switch (chip->Architecture) - { - case NV_ARCH_03: - nv3GetConfig(chip); - break; - case NV_ARCH_04: - nv4GetConfig(chip); - break; - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - nv10GetConfig(chip, pdev, chipset); - break; - default: - return (-1); - } - chip->Chipset = chipset; - /* - * Fill in FIFO pointers. - */ - chip->Rop = (RivaRop __iomem *)&(chip->FIFO[0x00000000/4]); - chip->Clip = (RivaClip __iomem *)&(chip->FIFO[0x00002000/4]); - chip->Patt = (RivaPattern __iomem *)&(chip->FIFO[0x00004000/4]); - chip->Pixmap = (RivaPixmap __iomem *)&(chip->FIFO[0x00006000/4]); - chip->Blt = (RivaScreenBlt __iomem *)&(chip->FIFO[0x00008000/4]); - chip->Bitmap = (RivaBitmap __iomem *)&(chip->FIFO[0x0000A000/4]); - chip->Line = (RivaLine __iomem *)&(chip->FIFO[0x0000C000/4]); - chip->Tri03 = (RivaTexturedTriangle03 __iomem *)&(chip->FIFO[0x0000E000/4]); - return (0); -} - diff --git a/drivers/video/fbdev/riva/riva_hw.h b/drivers/video/fbdev/riva/riva_hw.h deleted file mode 100644 index 5e7b35466b00..000000000000 --- a/drivers/video/fbdev/riva/riva_hw.h +++ /dev/null @@ -1,564 +0,0 @@ -/***************************************************************************\ -|* *| -|* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NOTICE TO USER: The source code is copyrighted under U.S. and *| -|* international laws. Users and possessors of this source code are *| -|* hereby granted a nonexclusive, royalty-free copyright license to *| -|* use this code in individual and commercial software. *| -|* *| -|* Any use of this source code must include, in the user documenta- *| -|* tion and internal comments to the code, notices to the end user *| -|* as follows: *| -|* *| -|* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *| -|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *| -|* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *| -|* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *| -|* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *| -|* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *| -|* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *| -|* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *| -|* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *| -|* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *| -|* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *| -|* *| -|* U.S. Government End Users. This source code is a "commercial *| -|* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *| -|* consisting of "commercial computer software" and "commercial *| -|* computer software documentation," as such terms are used in *| -|* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *| -|* ment only as a commercial end item. Consistent with 48 C.F.R. *| -|* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *| -|* all U.S. Government End Users acquire the source code with only *| -|* those rights set forth herein. *| -|* *| -\***************************************************************************/ - -/* - * GPL licensing note -- nVidia is allowing a liberal interpretation of - * the documentation restriction above, to merely say that this nVidia's - * copyright and disclaimer should be included with all code derived - * from this source. -- Jeff Garzik <jgarzik@pobox.com>, 01/Nov/99 - */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/riva_hw.h,v 1.21 2002/10/14 18:22:46 mvojkovi Exp $ */ -#ifndef __RIVA_HW_H__ -#define __RIVA_HW_H__ -#define RIVA_SW_VERSION 0x00010003 - -#ifndef Bool -typedef int Bool; -#endif - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef NULL -#define NULL 0 -#endif - -/* - * Typedefs to force certain sized values. - */ -typedef unsigned char U008; -typedef unsigned short U016; -typedef unsigned int U032; - -/* - * HW access macros. - */ -#include <asm/io.h> - -#define NV_WR08(p,i,d) (__raw_writeb((d), (void __iomem *)(p) + (i))) -#define NV_RD08(p,i) (__raw_readb((void __iomem *)(p) + (i))) -#define NV_WR16(p,i,d) (__raw_writew((d), (void __iomem *)(p) + (i))) -#define NV_RD16(p,i) (__raw_readw((void __iomem *)(p) + (i))) -#define NV_WR32(p,i,d) (__raw_writel((d), (void __iomem *)(p) + (i))) -#define NV_RD32(p,i) (__raw_readl((void __iomem *)(p) + (i))) - -#define VGA_WR08(p,i,d) (writeb((d), (void __iomem *)(p) + (i))) -#define VGA_RD08(p,i) (readb((void __iomem *)(p) + (i))) - -/* - * Define different architectures. - */ -#define NV_ARCH_03 0x03 -#define NV_ARCH_04 0x04 -#define NV_ARCH_10 0x10 -#define NV_ARCH_20 0x20 -#define NV_ARCH_30 0x30 -#define NV_ARCH_40 0x40 - -/***************************************************************************\ -* * -* FIFO registers. * -* * -\***************************************************************************/ - -/* - * Raster OPeration. Windows style ROP3. - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop; -#endif - U032 reserved01[0x0BB]; - U032 Rop3; -} RivaRop; -/* - * 8X8 Monochrome pattern. - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop; -#endif - U032 reserved01[0x0BD]; - U032 Shape; - U032 reserved03[0x001]; - U032 Color0; - U032 Color1; - U032 Monochrome[2]; -} RivaPattern; -/* - * Scissor clip rectangle. - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop; -#endif - U032 reserved01[0x0BB]; - U032 TopLeft; - U032 WidthHeight; -} RivaClip; -/* - * 2D filled rectangle. - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop[1]; -#endif - U032 reserved01[0x0BC]; - U032 Color; - U032 reserved03[0x03E]; - U032 TopLeft; - U032 WidthHeight; -} RivaRectangle; -/* - * 2D screen-screen BLT. - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop; -#endif - U032 reserved01[0x0BB]; - U032 TopLeftSrc; - U032 TopLeftDst; - U032 WidthHeight; -} RivaScreenBlt; -/* - * 2D pixel BLT. - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop[1]; -#endif - U032 reserved01[0x0BC]; - U032 TopLeft; - U032 WidthHeight; - U032 WidthHeightIn; - U032 reserved02[0x03C]; - U032 Pixels; -} RivaPixmap; -/* - * Filled rectangle combined with monochrome expand. Useful for glyphs. - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop; -#endif - U032 reserved01[0x0BB]; - U032 reserved03[(0x040)-1]; - U032 Color1A; - struct - { - U032 TopLeft; - U032 WidthHeight; - } UnclippedRectangle[64]; - U032 reserved04[(0x080)-3]; - struct - { - U032 TopLeft; - U032 BottomRight; - } ClipB; - U032 Color1B; - struct - { - U032 TopLeft; - U032 BottomRight; - } ClippedRectangle[64]; - U032 reserved05[(0x080)-5]; - struct - { - U032 TopLeft; - U032 BottomRight; - } ClipC; - U032 Color1C; - U032 WidthHeightC; - U032 PointC; - U032 MonochromeData1C; - U032 reserved06[(0x080)+121]; - struct - { - U032 TopLeft; - U032 BottomRight; - } ClipD; - U032 Color1D; - U032 WidthHeightInD; - U032 WidthHeightOutD; - U032 PointD; - U032 MonochromeData1D; - U032 reserved07[(0x080)+120]; - struct - { - U032 TopLeft; - U032 BottomRight; - } ClipE; - U032 Color0E; - U032 Color1E; - U032 WidthHeightInE; - U032 WidthHeightOutE; - U032 PointE; - U032 MonochromeData01E; -} RivaBitmap; -/* - * 3D textured, Z buffered triangle. - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop; -#endif - U032 reserved01[0x0BC]; - U032 TextureOffset; - U032 TextureFormat; - U032 TextureFilter; - U032 FogColor; -/* This is a problem on LynxOS */ -#ifdef Control -#undef Control -#endif - U032 Control; - U032 AlphaTest; - U032 reserved02[0x339]; - U032 FogAndIndex; - U032 Color; - float ScreenX; - float ScreenY; - float ScreenZ; - float EyeM; - float TextureS; - float TextureT; -} RivaTexturedTriangle03; -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop; -#endif - U032 reserved01[0x0BB]; - U032 ColorKey; - U032 TextureOffset; - U032 TextureFormat; - U032 TextureFilter; - U032 Blend; -/* This is a problem on LynxOS */ -#ifdef Control -#undef Control -#endif - U032 Control; - U032 FogColor; - U032 reserved02[0x39]; - struct - { - float ScreenX; - float ScreenY; - float ScreenZ; - float EyeM; - U032 Color; - U032 Specular; - float TextureS; - float TextureT; - } Vertex[16]; - U032 DrawTriangle3D; -} RivaTexturedTriangle05; -/* - * 2D line. - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop[1]; -#endif - U032 reserved01[0x0BC]; - U032 Color; /* source color 0304-0307*/ - U032 Reserved02[0x03e]; - struct { /* start aliased methods in array 0400- */ - U032 point0; /* y_x S16_S16 in pixels 0- 3*/ - U032 point1; /* y_x S16_S16 in pixels 4- 7*/ - } Lin[16]; /* end of aliased methods in array -047f*/ - struct { /* start aliased methods in array 0480- */ - U032 point0X; /* in pixels, 0 at left 0- 3*/ - U032 point0Y; /* in pixels, 0 at top 4- 7*/ - U032 point1X; /* in pixels, 0 at left 8- b*/ - U032 point1Y; /* in pixels, 0 at top c- f*/ - } Lin32[8]; /* end of aliased methods in array -04ff*/ - U032 PolyLin[32]; /* y_x S16_S16 in pixels 0500-057f*/ - struct { /* start aliased methods in array 0580- */ - U032 x; /* in pixels, 0 at left 0- 3*/ - U032 y; /* in pixels, 0 at top 4- 7*/ - } PolyLin32[16]; /* end of aliased methods in array -05ff*/ - struct { /* start aliased methods in array 0600- */ - U032 color; /* source color 0- 3*/ - U032 point; /* y_x S16_S16 in pixels 4- 7*/ - } ColorPolyLin[16]; /* end of aliased methods in array -067f*/ -} RivaLine; -/* - * 2D/3D surfaces - */ -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop; -#endif - U032 reserved01[0x0BE]; - U032 Offset; -} RivaSurface; -typedef volatile struct -{ - U032 reserved00[4]; -#ifdef __BIG_ENDIAN - U032 FifoFree; -#else - U016 FifoFree; - U016 Nop; -#endif - U032 reserved01[0x0BD]; - U032 Pitch; - U032 RenderBufferOffset; - U032 ZBufferOffset; -} RivaSurface3D; - -/***************************************************************************\ -* * -* Virtualized RIVA H/W interface. * -* * -\***************************************************************************/ - -#define FP_ENABLE 1 -#define FP_DITHER 2 - -struct _riva_hw_inst; -struct _riva_hw_state; -/* - * Virtialized chip interface. Makes RIVA 128 and TNT look alike. - */ -typedef struct _riva_hw_inst -{ - /* - * Chip specific settings. - */ - U032 Architecture; - U032 Version; - U032 Chipset; - U032 CrystalFreqKHz; - U032 RamAmountKBytes; - U032 MaxVClockFreqKHz; - U032 RamBandwidthKBytesPerSec; - U032 EnableIRQ; - U032 IO; - U032 VBlankBit; - U032 FifoFreeCount; - U032 FifoEmptyCount; - U032 CursorStart; - U032 flatPanel; - Bool twoHeads; - /* - * Non-FIFO registers. - */ - volatile U032 __iomem *PCRTC0; - volatile U032 __iomem *PCRTC; - volatile U032 __iomem *PRAMDAC0; - volatile U032 __iomem *PFB; - volatile U032 __iomem *PFIFO; - volatile U032 __iomem *PGRAPH; - volatile U032 __iomem *PEXTDEV; - volatile U032 __iomem *PTIMER; - volatile U032 __iomem *PMC; - volatile U032 __iomem *PRAMIN; - volatile U032 __iomem *FIFO; - volatile U032 __iomem *CURSOR; - volatile U008 __iomem *PCIO0; - volatile U008 __iomem *PCIO; - volatile U008 __iomem *PVIO; - volatile U008 __iomem *PDIO0; - volatile U008 __iomem *PDIO; - volatile U032 __iomem *PRAMDAC; - /* - * Common chip functions. - */ - int (*Busy)(struct _riva_hw_inst *); - void (*LoadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *); - void (*UnloadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *); - void (*SetStartAddress)(struct _riva_hw_inst *,U032); - void (*SetSurfaces2D)(struct _riva_hw_inst *,U032,U032); - void (*SetSurfaces3D)(struct _riva_hw_inst *,U032,U032); - int (*ShowHideCursor)(struct _riva_hw_inst *,int); - void (*LockUnlock)(struct _riva_hw_inst *, int); - /* - * Current extended mode settings. - */ - struct _riva_hw_state *CurrentState; - /* - * FIFO registers. - */ - RivaRop __iomem *Rop; - RivaPattern __iomem *Patt; - RivaClip __iomem *Clip; - RivaPixmap __iomem *Pixmap; - RivaScreenBlt __iomem *Blt; - RivaBitmap __iomem *Bitmap; - RivaLine __iomem *Line; - RivaTexturedTriangle03 __iomem *Tri03; - RivaTexturedTriangle05 __iomem *Tri05; -} RIVA_HW_INST; -/* - * Extended mode state information. - */ -typedef struct _riva_hw_state -{ - U032 bpp; - U032 width; - U032 height; - U032 interlace; - U032 repaint0; - U032 repaint1; - U032 screen; - U032 scale; - U032 dither; - U032 extra; - U032 pixel; - U032 horiz; - U032 arbitration0; - U032 arbitration1; - U032 vpll; - U032 vpll2; - U032 pllsel; - U032 general; - U032 crtcOwner; - U032 head; - U032 head2; - U032 config; - U032 cursorConfig; - U032 cursor0; - U032 cursor1; - U032 cursor2; - U032 offset0; - U032 offset1; - U032 offset2; - U032 offset3; - U032 pitch0; - U032 pitch1; - U032 pitch2; - U032 pitch3; -} RIVA_HW_STATE; - -/* - * function prototypes - */ - -extern int CalcStateExt -( - RIVA_HW_INST *chip, - RIVA_HW_STATE *state, - struct pci_dev *pdev, - int bpp, - int width, - int hDisplaySize, - int height, - int dotClock -); - -/* - * External routines. - */ -int RivaGetConfig(RIVA_HW_INST *chip, struct pci_dev *pdev, unsigned int c); -/* - * FIFO Free Count. Should attempt to yield processor if RIVA is busy. - */ - -#define RIVA_FIFO_FREE(hwinst,hwptr,cnt) \ -{ \ - while ((hwinst).FifoFreeCount < (cnt)) { \ - mb();mb(); \ - (hwinst).FifoFreeCount = NV_RD32(&(hwinst).hwptr->FifoFree, 0) >> 2; \ - } \ - (hwinst).FifoFreeCount -= (cnt); \ -} -#endif /* __RIVA_HW_H__ */ - diff --git a/drivers/video/fbdev/riva/riva_tbl.h b/drivers/video/fbdev/riva/riva_tbl.h deleted file mode 100644 index 7ee7d72932d4..000000000000 --- a/drivers/video/fbdev/riva/riva_tbl.h +++ /dev/null @@ -1,1008 +0,0 @@ - /***************************************************************************\ -|* *| -|* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NOTICE TO USER: The source code is copyrighted under U.S. and *| -|* international laws. Users and possessors of this source code are *| -|* hereby granted a nonexclusive, royalty-free copyright license to *| -|* use this code in individual and commercial software. *| -|* *| -|* Any use of this source code must include, in the user documenta- *| -|* tion and internal comments to the code, notices to the end user *| -|* as follows: *| -|* *| -|* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *| -|* *| -|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *| -|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *| -|* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *| -|* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *| -|* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *| -|* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *| -|* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *| -|* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *| -|* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *| -|* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *| -|* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *| -|* *| -|* U.S. Government End Users. This source code is a "commercial *| -|* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *| -|* consisting of "commercial computer software" and "commercial *| -|* computer software documentation," as such terms are used in *| -|* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *| -|* ment only as a commercial end item. Consistent with 48 C.F.R. *| -|* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *| -|* all U.S. Government End Users acquire the source code with only *| -|* those rights set forth herein. *| -|* *| - \***************************************************************************/ - -/* - * GPL licensing note -- nVidia is allowing a liberal interpretation of - * the documentation restriction above, to merely say that this nVidia's - * copyright and disclaimer should be included with all code derived - * from this source. -- Jeff Garzik <jgarzik@pobox.com>, 01/Nov/99 - */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/riva_tbl.h,v 1.9 2002/01/30 01:35:03 mvojkovi Exp $ */ - - -/* - * RIVA Fixed Functionality Init Tables. - */ -static unsigned RivaTablePMC[][2] = -{ - {0x00000050, 0x00000000}, - {0x00000080, 0xFFFF00FF}, - {0x00000080, 0xFFFFFFFF} -}; -static unsigned RivaTablePTIMER[][2] = -{ - {0x00000080, 0x00000008}, - {0x00000084, 0x00000003}, - {0x00000050, 0x00000000}, - {0x00000040, 0xFFFFFFFF} -}; -static unsigned RivaTableFIFO[][2] = -{ - {0x00000000, 0x80000000}, - {0x00000800, 0x80000001}, - {0x00001000, 0x80000002}, - {0x00001800, 0x80000010}, - {0x00002000, 0x80000011}, - {0x00002800, 0x80000012}, - {0x00003000, 0x80000016}, - {0x00003800, 0x80000013} -}; -static unsigned nv3TablePFIFO[][2] = -{ - {0x00000140, 0x00000000}, - {0x00000480, 0x00000000}, - {0x00000490, 0x00000000}, - {0x00000494, 0x00000000}, - {0x00000481, 0x00000000}, - {0x00000084, 0x00000000}, - {0x00000086, 0x00002000}, - {0x00000085, 0x00002200}, - {0x00000484, 0x00000000}, - {0x0000049C, 0x00000000}, - {0x00000104, 0x00000000}, - {0x00000108, 0x00000000}, - {0x00000100, 0x00000000}, - {0x000004A0, 0x00000000}, - {0x000004A4, 0x00000000}, - {0x000004A8, 0x00000000}, - {0x000004AC, 0x00000000}, - {0x000004B0, 0x00000000}, - {0x000004B4, 0x00000000}, - {0x000004B8, 0x00000000}, - {0x000004BC, 0x00000000}, - {0x00000050, 0x00000000}, - {0x00000040, 0xFFFFFFFF}, - {0x00000480, 0x00000001}, - {0x00000490, 0x00000001}, - {0x00000140, 0x00000001} -}; -static unsigned nv3TablePGRAPH[][2] = -{ - {0x00000020, 0x1230001F}, - {0x00000021, 0x10113000}, - {0x00000022, 0x1131F101}, - {0x00000023, 0x0100F531}, - {0x00000060, 0x00000000}, - {0x00000065, 0x00000000}, - {0x00000068, 0x00000000}, - {0x00000069, 0x00000000}, - {0x0000006A, 0x00000000}, - {0x0000006B, 0x00000000}, - {0x0000006C, 0x00000000}, - {0x0000006D, 0x00000000}, - {0x0000006E, 0x00000000}, - {0x0000006F, 0x00000000}, - {0x000001A8, 0x00000000}, - {0x00000440, 0xFFFFFFFF}, - {0x00000480, 0x00000001}, - {0x000001A0, 0x00000000}, - {0x000001A2, 0x00000000}, - {0x0000018A, 0xFFFFFFFF}, - {0x00000190, 0x00000000}, - {0x00000142, 0x00000000}, - {0x00000154, 0x00000000}, - {0x00000155, 0xFFFFFFFF}, - {0x00000156, 0x00000000}, - {0x00000157, 0xFFFFFFFF}, - {0x00000064, 0x10010002}, - {0x00000050, 0x00000000}, - {0x00000051, 0x00000000}, - {0x00000040, 0xFFFFFFFF}, - {0x00000041, 0xFFFFFFFF}, - {0x00000440, 0xFFFFFFFF}, - {0x000001A9, 0x00000001} -}; -static unsigned nv3TablePGRAPH_8BPP[][2] = -{ - {0x000001AA, 0x00001111} -}; -static unsigned nv3TablePGRAPH_15BPP[][2] = -{ - {0x000001AA, 0x00002222} -}; -static unsigned nv3TablePGRAPH_32BPP[][2] = -{ - {0x000001AA, 0x00003333} -}; -static unsigned nv3TablePRAMIN[][2] = -{ - {0x00000500, 0x00010000}, - {0x00000501, 0x007FFFFF}, - {0x00000200, 0x80000000}, - {0x00000201, 0x00C20341}, - {0x00000204, 0x80000001}, - {0x00000205, 0x00C50342}, - {0x00000208, 0x80000002}, - {0x00000209, 0x00C60343}, - {0x0000020C, 0x80000003}, - {0x0000020D, 0x00DC0348}, - {0x00000210, 0x80000004}, - {0x00000211, 0x00DC0349}, - {0x00000214, 0x80000005}, - {0x00000215, 0x00DC034A}, - {0x00000218, 0x80000006}, - {0x00000219, 0x00DC034B}, - {0x00000240, 0x80000010}, - {0x00000241, 0x00D10344}, - {0x00000244, 0x80000011}, - {0x00000245, 0x00D00345}, - {0x00000248, 0x80000012}, - {0x00000249, 0x00CC0346}, - {0x0000024C, 0x80000013}, - {0x0000024D, 0x00D70347}, - {0x00000258, 0x80000016}, - {0x00000259, 0x00CA034C}, - {0x00000D05, 0x00000000}, - {0x00000D06, 0x00000000}, - {0x00000D07, 0x00000000}, - {0x00000D09, 0x00000000}, - {0x00000D0A, 0x00000000}, - {0x00000D0B, 0x00000000}, - {0x00000D0D, 0x00000000}, - {0x00000D0E, 0x00000000}, - {0x00000D0F, 0x00000000}, - {0x00000D11, 0x00000000}, - {0x00000D12, 0x00000000}, - {0x00000D13, 0x00000000}, - {0x00000D15, 0x00000000}, - {0x00000D16, 0x00000000}, - {0x00000D17, 0x00000000}, - {0x00000D19, 0x00000000}, - {0x00000D1A, 0x00000000}, - {0x00000D1B, 0x00000000}, - {0x00000D1D, 0x00000140}, - {0x00000D1E, 0x00000000}, - {0x00000D1F, 0x00000000}, - {0x00000D20, 0x10100200}, - {0x00000D21, 0x00000000}, - {0x00000D22, 0x00000000}, - {0x00000D23, 0x00000000}, - {0x00000D24, 0x10210200}, - {0x00000D25, 0x00000000}, - {0x00000D26, 0x00000000}, - {0x00000D27, 0x00000000}, - {0x00000D28, 0x10420200}, - {0x00000D29, 0x00000000}, - {0x00000D2A, 0x00000000}, - {0x00000D2B, 0x00000000}, - {0x00000D2C, 0x10830200}, - {0x00000D2D, 0x00000000}, - {0x00000D2E, 0x00000000}, - {0x00000D2F, 0x00000000}, - {0x00000D31, 0x00000000}, - {0x00000D32, 0x00000000}, - {0x00000D33, 0x00000000} -}; -static unsigned nv3TablePRAMIN_8BPP[][2] = -{ - /* 0xXXXXX3XX For MSB mono format */ - /* 0xXXXXX2XX For LSB mono format */ - {0x00000D04, 0x10110203}, - {0x00000D08, 0x10110203}, - {0x00000D0C, 0x1011020B}, - {0x00000D10, 0x10118203}, - {0x00000D14, 0x10110203}, - {0x00000D18, 0x10110203}, - {0x00000D1C, 0x10419208}, - {0x00000D30, 0x10118203} -}; -static unsigned nv3TablePRAMIN_15BPP[][2] = -{ - /* 0xXXXXX2XX For MSB mono format */ - /* 0xXXXXX3XX For LSB mono format */ - {0x00000D04, 0x10110200}, - {0x00000D08, 0x10110200}, - {0x00000D0C, 0x10110208}, - {0x00000D10, 0x10118200}, - {0x00000D14, 0x10110200}, - {0x00000D18, 0x10110200}, - {0x00000D1C, 0x10419208}, - {0x00000D30, 0x10118200} -}; -static unsigned nv3TablePRAMIN_32BPP[][2] = -{ - /* 0xXXXXX3XX For MSB mono format */ - /* 0xXXXXX2XX For LSB mono format */ - {0x00000D04, 0x10110201}, - {0x00000D08, 0x10110201}, - {0x00000D0C, 0x10110209}, - {0x00000D10, 0x10118201}, - {0x00000D14, 0x10110201}, - {0x00000D18, 0x10110201}, - {0x00000D1C, 0x10419208}, - {0x00000D30, 0x10118201} -}; -static unsigned nv4TableFIFO[][2] = -{ - {0x00003800, 0x80000014} -}; -static unsigned nv4TablePFIFO[][2] = -{ - {0x00000140, 0x00000000}, - {0x00000480, 0x00000000}, - {0x00000494, 0x00000000}, - {0x00000481, 0x00000000}, - {0x0000048B, 0x00000000}, - {0x00000400, 0x00000000}, - {0x00000414, 0x00000000}, - {0x00000084, 0x03000100}, - {0x00000085, 0x00000110}, - {0x00000086, 0x00000112}, - {0x00000143, 0x0000FFFF}, - {0x00000496, 0x0000FFFF}, - {0x00000050, 0x00000000}, - {0x00000040, 0xFFFFFFFF}, - {0x00000415, 0x00000001}, - {0x00000480, 0x00000001}, - {0x00000494, 0x00000001}, - {0x00000495, 0x00000001}, - {0x00000140, 0x00000001} -}; -static unsigned nv4TablePGRAPH[][2] = -{ - {0x00000020, 0x1231C001}, - {0x00000021, 0x72111101}, - {0x00000022, 0x11D5F071}, - {0x00000023, 0x10D4FF31}, - {0x00000060, 0x00000000}, - {0x00000068, 0x00000000}, - {0x00000070, 0x00000000}, - {0x00000078, 0x00000000}, - {0x00000061, 0x00000000}, - {0x00000069, 0x00000000}, - {0x00000071, 0x00000000}, - {0x00000079, 0x00000000}, - {0x00000062, 0x00000000}, - {0x0000006A, 0x00000000}, - {0x00000072, 0x00000000}, - {0x0000007A, 0x00000000}, - {0x00000063, 0x00000000}, - {0x0000006B, 0x00000000}, - {0x00000073, 0x00000000}, - {0x0000007B, 0x00000000}, - {0x00000064, 0x00000000}, - {0x0000006C, 0x00000000}, - {0x00000074, 0x00000000}, - {0x0000007C, 0x00000000}, - {0x00000065, 0x00000000}, - {0x0000006D, 0x00000000}, - {0x00000075, 0x00000000}, - {0x0000007D, 0x00000000}, - {0x00000066, 0x00000000}, - {0x0000006E, 0x00000000}, - {0x00000076, 0x00000000}, - {0x0000007E, 0x00000000}, - {0x00000067, 0x00000000}, - {0x0000006F, 0x00000000}, - {0x00000077, 0x00000000}, - {0x0000007F, 0x00000000}, - {0x00000058, 0x00000000}, - {0x00000059, 0x00000000}, - {0x0000005A, 0x00000000}, - {0x0000005B, 0x00000000}, - {0x00000196, 0x00000000}, - {0x000001A1, 0x01FFFFFF}, - {0x00000197, 0x00000000}, - {0x000001A2, 0x01FFFFFF}, - {0x00000198, 0x00000000}, - {0x000001A3, 0x01FFFFFF}, - {0x00000199, 0x00000000}, - {0x000001A4, 0x01FFFFFF}, - {0x00000050, 0x00000000}, - {0x00000040, 0xFFFFFFFF}, - {0x0000005C, 0x10010100}, - {0x000001C4, 0xFFFFFFFF}, - {0x000001C8, 0x00000001}, - {0x00000204, 0x00000000}, - {0x000001C3, 0x00000001} -}; -static unsigned nv4TablePGRAPH_8BPP[][2] = -{ - {0x000001C9, 0x00111111}, - {0x00000186, 0x00001010}, - {0x0000020C, 0x03020202} -}; -static unsigned nv4TablePGRAPH_15BPP[][2] = -{ - {0x000001C9, 0x00226222}, - {0x00000186, 0x00002071}, - {0x0000020C, 0x09080808} -}; -static unsigned nv4TablePGRAPH_16BPP[][2] = -{ - {0x000001C9, 0x00556555}, - {0x00000186, 0x000050C2}, - {0x0000020C, 0x0C0B0B0B} -}; -static unsigned nv4TablePGRAPH_32BPP[][2] = -{ - {0x000001C9, 0x0077D777}, - {0x00000186, 0x000070E5}, - {0x0000020C, 0x0E0D0D0D} -}; -static unsigned nv4TablePRAMIN[][2] = -{ - {0x00000000, 0x80000010}, - {0x00000001, 0x80011145}, - {0x00000002, 0x80000011}, - {0x00000003, 0x80011146}, - {0x00000004, 0x80000012}, - {0x00000005, 0x80011147}, - {0x00000006, 0x80000013}, - {0x00000007, 0x80011148}, - {0x00000008, 0x80000014}, - {0x00000009, 0x80011149}, - {0x0000000A, 0x80000015}, - {0x0000000B, 0x8001114A}, - {0x0000000C, 0x80000016}, - {0x0000000D, 0x8001114F}, - {0x00000020, 0x80000000}, - {0x00000021, 0x80011142}, - {0x00000022, 0x80000001}, - {0x00000023, 0x80011143}, - {0x00000024, 0x80000002}, - {0x00000025, 0x80011144}, - {0x00000026, 0x80000003}, - {0x00000027, 0x8001114B}, - {0x00000028, 0x80000004}, - {0x00000029, 0x8001114C}, - {0x0000002A, 0x80000005}, - {0x0000002B, 0x8001114D}, - {0x0000002C, 0x80000006}, - {0x0000002D, 0x8001114E}, - {0x00000500, 0x00003000}, - {0x00000501, 0x01FFFFFF}, - {0x00000502, 0x00000002}, - {0x00000503, 0x00000002}, - {0x00000508, 0x01008043}, - {0x0000050A, 0x00000000}, - {0x0000050B, 0x00000000}, - {0x0000050C, 0x01008019}, - {0x0000050E, 0x00000000}, - {0x0000050F, 0x00000000}, -#if 1 - {0x00000510, 0x01008018}, -#else - {0x00000510, 0x01008044}, -#endif - {0x00000512, 0x00000000}, - {0x00000513, 0x00000000}, - {0x00000514, 0x01008021}, - {0x00000516, 0x00000000}, - {0x00000517, 0x00000000}, - {0x00000518, 0x0100805F}, - {0x0000051A, 0x00000000}, - {0x0000051B, 0x00000000}, -#if 1 - {0x0000051C, 0x0100804B}, -#else - {0x0000051C, 0x0100804A}, -#endif - {0x0000051E, 0x00000000}, - {0x0000051F, 0x00000000}, - {0x00000520, 0x0100A048}, - {0x00000521, 0x00000D01}, - {0x00000522, 0x11401140}, - {0x00000523, 0x00000000}, - {0x00000524, 0x0300A054}, - {0x00000525, 0x00000D01}, - {0x00000526, 0x11401140}, - {0x00000527, 0x00000000}, - {0x00000528, 0x0300A055}, - {0x00000529, 0x00000D01}, - {0x0000052A, 0x11401140}, - {0x0000052B, 0x00000000}, - {0x0000052C, 0x00000058}, - {0x0000052E, 0x11401140}, - {0x0000052F, 0x00000000}, - {0x00000530, 0x00000059}, - {0x00000532, 0x11401140}, - {0x00000533, 0x00000000}, - {0x00000534, 0x0000005A}, - {0x00000536, 0x11401140}, - {0x00000537, 0x00000000}, - {0x00000538, 0x0000005B}, - {0x0000053A, 0x11401140}, - {0x0000053B, 0x00000000}, - {0x0000053C, 0x0300A01C}, - {0x0000053E, 0x11401140}, - {0x0000053F, 0x00000000} -}; -static unsigned nv4TablePRAMIN_8BPP[][2] = -{ - /* 0xXXXXXX01 For MSB mono format */ - /* 0xXXXXXX02 For LSB mono format */ - {0x00000509, 0x00000302}, - {0x0000050D, 0x00000302}, - {0x00000511, 0x00000202}, - {0x00000515, 0x00000302}, - {0x00000519, 0x00000302}, - {0x0000051D, 0x00000302}, - {0x0000052D, 0x00000302}, - {0x0000052E, 0x00000302}, - {0x00000535, 0x00000000}, - {0x00000539, 0x00000000}, - {0x0000053D, 0x00000302} -}; -static unsigned nv4TablePRAMIN_15BPP[][2] = -{ - /* 0xXXXXXX01 For MSB mono format */ - /* 0xXXXXXX02 For LSB mono format */ - {0x00000509, 0x00000902}, - {0x0000050D, 0x00000902}, - {0x00000511, 0x00000802}, - {0x00000515, 0x00000902}, - {0x00000519, 0x00000902}, - {0x0000051D, 0x00000902}, - {0x0000052D, 0x00000902}, - {0x0000052E, 0x00000902}, - {0x00000535, 0x00000702}, - {0x00000539, 0x00000702}, - {0x0000053D, 0x00000902} -}; -static unsigned nv4TablePRAMIN_16BPP[][2] = -{ - /* 0xXXXXXX01 For MSB mono format */ - /* 0xXXXXXX02 For LSB mono format */ - {0x00000509, 0x00000C02}, - {0x0000050D, 0x00000C02}, - {0x00000511, 0x00000B02}, - {0x00000515, 0x00000C02}, - {0x00000519, 0x00000C02}, - {0x0000051D, 0x00000C02}, - {0x0000052D, 0x00000C02}, - {0x0000052E, 0x00000C02}, - {0x00000535, 0x00000702}, - {0x00000539, 0x00000702}, - {0x0000053D, 0x00000C02} -}; -static unsigned nv4TablePRAMIN_32BPP[][2] = -{ - /* 0xXXXXXX01 For MSB mono format */ - /* 0xXXXXXX02 For LSB mono format */ - {0x00000509, 0x00000E02}, - {0x0000050D, 0x00000E02}, - {0x00000511, 0x00000D02}, - {0x00000515, 0x00000E02}, - {0x00000519, 0x00000E02}, - {0x0000051D, 0x00000E02}, - {0x0000052D, 0x00000E02}, - {0x0000052E, 0x00000E02}, - {0x00000535, 0x00000E02}, - {0x00000539, 0x00000E02}, - {0x0000053D, 0x00000E02} -}; -static unsigned nv10TableFIFO[][2] = -{ - {0x00003800, 0x80000014} -}; -static unsigned nv10TablePFIFO[][2] = -{ - {0x00000140, 0x00000000}, - {0x00000480, 0x00000000}, - {0x00000494, 0x00000000}, - {0x00000481, 0x00000000}, - {0x0000048B, 0x00000000}, - {0x00000400, 0x00000000}, - {0x00000414, 0x00000000}, - {0x00000084, 0x03000100}, - {0x00000085, 0x00000110}, - {0x00000086, 0x00000112}, - {0x00000143, 0x0000FFFF}, - {0x00000496, 0x0000FFFF}, - {0x00000050, 0x00000000}, - {0x00000040, 0xFFFFFFFF}, - {0x00000415, 0x00000001}, - {0x00000480, 0x00000001}, - {0x00000494, 0x00000001}, - {0x00000495, 0x00000001}, - {0x00000140, 0x00000001} -}; -static unsigned nv10TablePGRAPH[][2] = -{ - {0x00000020, 0x0003FFFF}, - {0x00000021, 0x00118701}, - {0x00000022, 0x24F82AD9}, - {0x00000023, 0x55DE0030}, - {0x00000020, 0x00000000}, - {0x00000024, 0x00000000}, - {0x00000058, 0x00000000}, - {0x00000060, 0x00000000}, - {0x00000068, 0x00000000}, - {0x00000070, 0x00000000}, - {0x00000078, 0x00000000}, - {0x00000059, 0x00000000}, - {0x00000061, 0x00000000}, - {0x00000069, 0x00000000}, - {0x00000071, 0x00000000}, - {0x00000079, 0x00000000}, - {0x0000005A, 0x00000000}, - {0x00000062, 0x00000000}, - {0x0000006A, 0x00000000}, - {0x00000072, 0x00000000}, - {0x0000007A, 0x00000000}, - {0x0000005B, 0x00000000}, - {0x00000063, 0x00000000}, - {0x0000006B, 0x00000000}, - {0x00000073, 0x00000000}, - {0x0000007B, 0x00000000}, - {0x0000005C, 0x00000000}, - {0x00000064, 0x00000000}, - {0x0000006C, 0x00000000}, - {0x00000074, 0x00000000}, - {0x0000007C, 0x00000000}, - {0x0000005D, 0x00000000}, - {0x00000065, 0x00000000}, - {0x0000006D, 0x00000000}, - {0x00000075, 0x00000000}, - {0x0000007D, 0x00000000}, - {0x0000005E, 0x00000000}, - {0x00000066, 0x00000000}, - {0x0000006E, 0x00000000}, - {0x00000076, 0x00000000}, - {0x0000007E, 0x00000000}, - {0x0000005F, 0x00000000}, - {0x00000067, 0x00000000}, - {0x0000006F, 0x00000000}, - {0x00000077, 0x00000000}, - {0x0000007F, 0x00000000}, - {0x00000053, 0x00000000}, - {0x00000054, 0x00000000}, - {0x00000055, 0x00000000}, - {0x00000056, 0x00000000}, - {0x00000057, 0x00000000}, - {0x00000196, 0x00000000}, - {0x000001A1, 0x01FFFFFF}, - {0x00000197, 0x00000000}, - {0x000001A2, 0x01FFFFFF}, - {0x00000198, 0x00000000}, - {0x000001A3, 0x01FFFFFF}, - {0x00000199, 0x00000000}, - {0x000001A4, 0x01FFFFFF}, - {0x0000019A, 0x00000000}, - {0x000001A5, 0x01FFFFFF}, - {0x0000019B, 0x00000000}, - {0x000001A6, 0x01FFFFFF}, - {0x00000050, 0x01111111}, - {0x00000040, 0xFFFFFFFF}, - {0x00000051, 0x10010100}, - {0x000001C5, 0xFFFFFFFF}, - {0x000001C8, 0x00000001}, - {0x00000204, 0x00000000}, - {0x000001C4, 0x00000001} -}; -static unsigned nv10TablePGRAPH_8BPP[][2] = -{ - {0x000001C9, 0x00111111}, - {0x00000186, 0x00001010}, - {0x0000020C, 0x03020202} -}; -static unsigned nv10TablePGRAPH_15BPP[][2] = -{ - {0x000001C9, 0x00226222}, - {0x00000186, 0x00002071}, - {0x0000020C, 0x09080808} -}; -static unsigned nv10TablePGRAPH_16BPP[][2] = -{ - {0x000001C9, 0x00556555}, - {0x00000186, 0x000050C2}, - {0x0000020C, 0x000B0B0C} -}; -static unsigned nv10TablePGRAPH_32BPP[][2] = -{ - {0x000001C9, 0x0077D777}, - {0x00000186, 0x000070E5}, - {0x0000020C, 0x0E0D0D0D} -}; -static unsigned nv10tri05TablePGRAPH[][2] = -{ - {(0x00000E00/4), 0x00000000}, - {(0x00000E04/4), 0x00000000}, - {(0x00000E08/4), 0x00000000}, - {(0x00000E0C/4), 0x00000000}, - {(0x00000E10/4), 0x00001000}, - {(0x00000E14/4), 0x00001000}, - {(0x00000E18/4), 0x4003ff80}, - {(0x00000E1C/4), 0x00000000}, - {(0x00000E20/4), 0x00000000}, - {(0x00000E24/4), 0x00000000}, - {(0x00000E28/4), 0x00000000}, - {(0x00000E2C/4), 0x00000000}, - {(0x00000E30/4), 0x00080008}, - {(0x00000E34/4), 0x00080008}, - {(0x00000E38/4), 0x00000000}, - {(0x00000E3C/4), 0x00000000}, - {(0x00000E40/4), 0x00000000}, - {(0x00000E44/4), 0x00000000}, - {(0x00000E48/4), 0x00000000}, - {(0x00000E4C/4), 0x00000000}, - {(0x00000E50/4), 0x00000000}, - {(0x00000E54/4), 0x00000000}, - {(0x00000E58/4), 0x00000000}, - {(0x00000E5C/4), 0x00000000}, - {(0x00000E60/4), 0x00000000}, - {(0x00000E64/4), 0x10000000}, - {(0x00000E68/4), 0x00000000}, - {(0x00000E6C/4), 0x00000000}, - {(0x00000E70/4), 0x00000000}, - {(0x00000E74/4), 0x00000000}, - {(0x00000E78/4), 0x00000000}, - {(0x00000E7C/4), 0x00000000}, - {(0x00000E80/4), 0x00000000}, - {(0x00000E84/4), 0x00000000}, - {(0x00000E88/4), 0x08000000}, - {(0x00000E8C/4), 0x00000000}, - {(0x00000E90/4), 0x00000000}, - {(0x00000E94/4), 0x00000000}, - {(0x00000E98/4), 0x00000000}, - {(0x00000E9C/4), 0x4B7FFFFF}, - {(0x00000EA0/4), 0x00000000}, - {(0x00000EA4/4), 0x00000000}, - {(0x00000EA8/4), 0x00000000}, - {(0x00000F00/4), 0x07FF0800}, - {(0x00000F04/4), 0x07FF0800}, - {(0x00000F08/4), 0x07FF0800}, - {(0x00000F0C/4), 0x07FF0800}, - {(0x00000F10/4), 0x07FF0800}, - {(0x00000F14/4), 0x07FF0800}, - {(0x00000F18/4), 0x07FF0800}, - {(0x00000F1C/4), 0x07FF0800}, - {(0x00000F20/4), 0x07FF0800}, - {(0x00000F24/4), 0x07FF0800}, - {(0x00000F28/4), 0x07FF0800}, - {(0x00000F2C/4), 0x07FF0800}, - {(0x00000F30/4), 0x07FF0800}, - {(0x00000F34/4), 0x07FF0800}, - {(0x00000F38/4), 0x07FF0800}, - {(0x00000F3C/4), 0x07FF0800}, - {(0x00000F40/4), 0x10000000}, - {(0x00000F44/4), 0x00000000}, - {(0x00000F50/4), 0x00006740}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F50/4), 0x00006750}, - {(0x00000F54/4), 0x40000000}, - {(0x00000F54/4), 0x40000000}, - {(0x00000F54/4), 0x40000000}, - {(0x00000F54/4), 0x40000000}, - {(0x00000F50/4), 0x00006760}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x00006770}, - {(0x00000F54/4), 0xC5000000}, - {(0x00000F54/4), 0xC5000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x00006780}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x000067A0}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F50/4), 0x00006AB0}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F50/4), 0x00006AC0}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x00006C10}, - {(0x00000F54/4), 0xBF800000}, - {(0x00000F50/4), 0x00007030}, - {(0x00000F54/4), 0x7149F2CA}, - {(0x00000F50/4), 0x00007040}, - {(0x00000F54/4), 0x7149F2CA}, - {(0x00000F50/4), 0x00007050}, - {(0x00000F54/4), 0x7149F2CA}, - {(0x00000F50/4), 0x00007060}, - {(0x00000F54/4), 0x7149F2CA}, - {(0x00000F50/4), 0x00007070}, - {(0x00000F54/4), 0x7149F2CA}, - {(0x00000F50/4), 0x00007080}, - {(0x00000F54/4), 0x7149F2CA}, - {(0x00000F50/4), 0x00007090}, - {(0x00000F54/4), 0x7149F2CA}, - {(0x00000F50/4), 0x000070A0}, - {(0x00000F54/4), 0x7149F2CA}, - {(0x00000F50/4), 0x00006A80}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F50/4), 0x00006AA0}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x00000040}, - {(0x00000F54/4), 0x00000005}, - {(0x00000F50/4), 0x00006400}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x4B7FFFFF}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x00006410}, - {(0x00000F54/4), 0xC5000000}, - {(0x00000F54/4), 0xC5000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x00006420}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x00006430}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x000064C0}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F54/4), 0x477FFFFF}, - {(0x00000F54/4), 0x3F800000}, - {(0x00000F50/4), 0x000064D0}, - {(0x00000F54/4), 0xC5000000}, - {(0x00000F54/4), 0xC5000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x000064E0}, - {(0x00000F54/4), 0xC4FFF000}, - {(0x00000F54/4), 0xC4FFF000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F50/4), 0x000064F0}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F54/4), 0x00000000}, - {(0x00000F40/4), 0x30000000}, - {(0x00000F44/4), 0x00000004}, - {(0x00000F48/4), 0x10000000}, - {(0x00000F4C/4), 0x00000000} -}; -static unsigned nv10TablePRAMIN[][2] = -{ - {0x00000000, 0x80000010}, - {0x00000001, 0x80011145}, - {0x00000002, 0x80000011}, - {0x00000003, 0x80011146}, - {0x00000004, 0x80000012}, - {0x00000005, 0x80011147}, - {0x00000006, 0x80000013}, - {0x00000007, 0x80011148}, - {0x00000008, 0x80000014}, - {0x00000009, 0x80011149}, - {0x0000000A, 0x80000015}, - {0x0000000B, 0x8001114A}, - {0x0000000C, 0x80000016}, - {0x0000000D, 0x80011150}, - {0x00000020, 0x80000000}, - {0x00000021, 0x80011142}, - {0x00000022, 0x80000001}, - {0x00000023, 0x80011143}, - {0x00000024, 0x80000002}, - {0x00000025, 0x80011144}, - {0x00000026, 0x80000003}, - {0x00000027, 0x8001114B}, - {0x00000028, 0x80000004}, - {0x00000029, 0x8001114C}, - {0x0000002A, 0x80000005}, - {0x0000002B, 0x8001114D}, - {0x0000002C, 0x80000006}, - {0x0000002D, 0x8001114E}, - {0x0000002E, 0x80000007}, - {0x0000002F, 0x8001114F}, - {0x00000500, 0x00003000}, - {0x00000501, 0x01FFFFFF}, - {0x00000502, 0x00000002}, - {0x00000503, 0x00000002}, -#ifdef __BIG_ENDIAN - {0x00000508, 0x01088043}, -#else - {0x00000508, 0x01008043}, -#endif - {0x0000050A, 0x00000000}, - {0x0000050B, 0x00000000}, -#ifdef __BIG_ENDIAN - {0x0000050C, 0x01088019}, -#else - {0x0000050C, 0x01008019}, -#endif - {0x0000050E, 0x00000000}, - {0x0000050F, 0x00000000}, -#ifdef __BIG_ENDIAN - {0x00000510, 0x01088018}, -#else - {0x00000510, 0x01008018}, -#endif - {0x00000512, 0x00000000}, - {0x00000513, 0x00000000}, -#ifdef __BIG_ENDIAN - {0x00000514, 0x01088021}, -#else - {0x00000514, 0x01008021}, -#endif - {0x00000516, 0x00000000}, - {0x00000517, 0x00000000}, -#ifdef __BIG_ENDIAN - {0x00000518, 0x0108805F}, -#else - {0x00000518, 0x0100805F}, -#endif - {0x0000051A, 0x00000000}, - {0x0000051B, 0x00000000}, -#ifdef __BIG_ENDIAN - {0x0000051C, 0x0108804B}, -#else - {0x0000051C, 0x0100804B}, -#endif - {0x0000051E, 0x00000000}, - {0x0000051F, 0x00000000}, - {0x00000520, 0x0100A048}, - {0x00000521, 0x00000D01}, - {0x00000522, 0x11401140}, - {0x00000523, 0x00000000}, - {0x00000524, 0x0300A094}, - {0x00000525, 0x00000D01}, - {0x00000526, 0x11401140}, - {0x00000527, 0x00000000}, - {0x00000528, 0x0300A095}, - {0x00000529, 0x00000D01}, - {0x0000052A, 0x11401140}, - {0x0000052B, 0x00000000}, -#ifdef __BIG_ENDIAN - {0x0000052C, 0x00080058}, -#else - {0x0000052C, 0x00000058}, -#endif - {0x0000052E, 0x11401140}, - {0x0000052F, 0x00000000}, -#ifdef __BIG_ENDIAN - {0x00000530, 0x00080059}, -#else - {0x00000530, 0x00000059}, -#endif - {0x00000532, 0x11401140}, - {0x00000533, 0x00000000}, - {0x00000534, 0x0000005A}, - {0x00000536, 0x11401140}, - {0x00000537, 0x00000000}, - {0x00000538, 0x0000005B}, - {0x0000053A, 0x11401140}, - {0x0000053B, 0x00000000}, - {0x0000053C, 0x00000093}, - {0x0000053E, 0x11401140}, - {0x0000053F, 0x00000000}, -#ifdef __BIG_ENDIAN - {0x00000540, 0x0308A01C}, -#else - {0x00000540, 0x0300A01C}, -#endif - {0x00000542, 0x11401140}, - {0x00000543, 0x00000000} -}; -static unsigned nv10TablePRAMIN_8BPP[][2] = -{ - /* 0xXXXXXX01 For MSB mono format */ - /* 0xXXXXXX02 For LSB mono format */ - {0x00000509, 0x00000302}, - {0x0000050D, 0x00000302}, - {0x00000511, 0x00000202}, - {0x00000515, 0x00000302}, - {0x00000519, 0x00000302}, - {0x0000051D, 0x00000302}, - {0x0000052D, 0x00000302}, - {0x0000052E, 0x00000302}, - {0x00000535, 0x00000000}, - {0x00000539, 0x00000000}, - {0x0000053D, 0x00000000}, - {0x00000541, 0x00000302} -}; -static unsigned nv10TablePRAMIN_15BPP[][2] = -{ - /* 0xXXXXXX01 For MSB mono format */ - /* 0xXXXXXX02 For LSB mono format */ - {0x00000509, 0x00000902}, - {0x0000050D, 0x00000902}, - {0x00000511, 0x00000802}, - {0x00000515, 0x00000902}, - {0x00000519, 0x00000902}, - {0x0000051D, 0x00000902}, - {0x0000052D, 0x00000902}, - {0x0000052E, 0x00000902}, - {0x00000535, 0x00000902}, - {0x00000539, 0x00000902}, - {0x0000053D, 0x00000902}, - {0x00000541, 0x00000902} -}; -static unsigned nv10TablePRAMIN_16BPP[][2] = -{ - /* 0xXXXXXX01 For MSB mono format */ - /* 0xXXXXXX02 For LSB mono format */ - {0x00000509, 0x00000C02}, - {0x0000050D, 0x00000C02}, - {0x00000511, 0x00000B02}, - {0x00000515, 0x00000C02}, - {0x00000519, 0x00000C02}, - {0x0000051D, 0x00000C02}, - {0x0000052D, 0x00000C02}, - {0x0000052E, 0x00000C02}, - {0x00000535, 0x00000C02}, - {0x00000539, 0x00000C02}, - {0x0000053D, 0x00000C02}, - {0x00000541, 0x00000C02} -}; -static unsigned nv10TablePRAMIN_32BPP[][2] = -{ - /* 0xXXXXXX01 For MSB mono format */ - /* 0xXXXXXX02 For LSB mono format */ - {0x00000509, 0x00000E02}, - {0x0000050D, 0x00000E02}, - {0x00000511, 0x00000D02}, - {0x00000515, 0x00000E02}, - {0x00000519, 0x00000E02}, - {0x0000051D, 0x00000E02}, - {0x0000052D, 0x00000E02}, - {0x0000052E, 0x00000E02}, - {0x00000535, 0x00000E02}, - {0x00000539, 0x00000E02}, - {0x0000053D, 0x00000E02}, - {0x00000541, 0x00000E02} -}; - diff --git a/drivers/video/fbdev/riva/rivafb-i2c.c b/drivers/video/fbdev/riva/rivafb-i2c.c deleted file mode 100644 index 6a183375ced1..000000000000 --- a/drivers/video/fbdev/riva/rivafb-i2c.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * linux/drivers/video/riva/fbdev-i2c.c - nVidia i2c - * - * Maintained by Ani Joshi <ajoshi@shell.unixbox.com> - * - * Copyright 2004 Antonino A. Daplas <adaplas @pol.net> - * - * Based on radeonfb-i2c.c - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file COPYING in the main directory of this archive - * for more details. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/delay.h> -#include <linux/pci.h> -#include <linux/fb.h> -#include <linux/jiffies.h> - -#include <asm/io.h> - -#include "rivafb.h" -#include "../edid.h" - -static void riva_gpio_setscl(void* data, int state) -{ - struct riva_i2c_chan *chan = data; - struct riva_par *par = chan->par; - u32 val; - - VGA_WR08(par->riva.PCIO, 0x3d4, chan->ddc_base + 1); - val = VGA_RD08(par->riva.PCIO, 0x3d5) & 0xf0; - - if (state) - val |= 0x20; - else - val &= ~0x20; - - VGA_WR08(par->riva.PCIO, 0x3d4, chan->ddc_base + 1); - VGA_WR08(par->riva.PCIO, 0x3d5, val | 0x1); -} - -static void riva_gpio_setsda(void* data, int state) -{ - struct riva_i2c_chan *chan = data; - struct riva_par *par = chan->par; - u32 val; - - VGA_WR08(par->riva.PCIO, 0x3d4, chan->ddc_base + 1); - val = VGA_RD08(par->riva.PCIO, 0x3d5) & 0xf0; - - if (state) - val |= 0x10; - else - val &= ~0x10; - - VGA_WR08(par->riva.PCIO, 0x3d4, chan->ddc_base + 1); - VGA_WR08(par->riva.PCIO, 0x3d5, val | 0x1); -} - -static int riva_gpio_getscl(void* data) -{ - struct riva_i2c_chan *chan = data; - struct riva_par *par = chan->par; - u32 val = 0; - - VGA_WR08(par->riva.PCIO, 0x3d4, chan->ddc_base); - if (VGA_RD08(par->riva.PCIO, 0x3d5) & 0x04) - val = 1; - - return val; -} - -static int riva_gpio_getsda(void* data) -{ - struct riva_i2c_chan *chan = data; - struct riva_par *par = chan->par; - u32 val = 0; - - VGA_WR08(par->riva.PCIO, 0x3d4, chan->ddc_base); - if (VGA_RD08(par->riva.PCIO, 0x3d5) & 0x08) - val = 1; - - return val; -} - -static int riva_setup_i2c_bus(struct riva_i2c_chan *chan, const char *name, - unsigned int i2c_class) -{ - int rc; - - strcpy(chan->adapter.name, name); - chan->adapter.owner = THIS_MODULE; - chan->adapter.class = i2c_class; - chan->adapter.algo_data = &chan->algo; - chan->adapter.dev.parent = &chan->par->pdev->dev; - chan->algo.setsda = riva_gpio_setsda; - chan->algo.setscl = riva_gpio_setscl; - chan->algo.getsda = riva_gpio_getsda; - chan->algo.getscl = riva_gpio_getscl; - chan->algo.udelay = 40; - chan->algo.timeout = msecs_to_jiffies(2); - chan->algo.data = chan; - - i2c_set_adapdata(&chan->adapter, chan); - - /* Raise SCL and SDA */ - riva_gpio_setsda(chan, 1); - riva_gpio_setscl(chan, 1); - udelay(20); - - rc = i2c_bit_add_bus(&chan->adapter); - if (rc == 0) - dev_dbg(&chan->par->pdev->dev, "I2C bus %s registered.\n", name); - else { - dev_warn(&chan->par->pdev->dev, - "Failed to register I2C bus %s.\n", name); - chan->par = NULL; - } - - return rc; -} - -void riva_create_i2c_busses(struct riva_par *par) -{ - par->chan[0].par = par; - par->chan[1].par = par; - par->chan[2].par = par; - - par->chan[0].ddc_base = 0x36; - par->chan[1].ddc_base = 0x3e; - par->chan[2].ddc_base = 0x50; - riva_setup_i2c_bus(&par->chan[0], "BUS1", I2C_CLASS_HWMON); - riva_setup_i2c_bus(&par->chan[1], "BUS2", 0); - riva_setup_i2c_bus(&par->chan[2], "BUS3", 0); -} - -void riva_delete_i2c_busses(struct riva_par *par) -{ - int i; - - for (i = 0; i < 3; i++) { - if (!par->chan[i].par) - continue; - i2c_del_adapter(&par->chan[i].adapter); - par->chan[i].par = NULL; - } -} - -int riva_probe_i2c_connector(struct riva_par *par, int conn, u8 **out_edid) -{ - u8 *edid = NULL; - - if (par->chan[conn].par) - edid = fb_ddc_read(&par->chan[conn].adapter); - - if (out_edid) - *out_edid = edid; - if (!edid) - return 1; - - return 0; -} - diff --git a/drivers/video/fbdev/riva/rivafb.h b/drivers/video/fbdev/riva/rivafb.h deleted file mode 100644 index 593297ca2b20..000000000000 --- a/drivers/video/fbdev/riva/rivafb.h +++ /dev/null @@ -1,76 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __RIVAFB_H -#define __RIVAFB_H - -#include <linux/fb.h> -#include <video/vga.h> -#include <linux/i2c.h> -#include <linux/i2c-algo-bit.h> - -#include "riva_hw.h" - -/* GGI compatibility macros */ -#define NUM_SEQ_REGS 0x05 -#define NUM_CRT_REGS 0x41 -#define NUM_GRC_REGS 0x09 -#define NUM_ATC_REGS 0x15 - -/* I2C */ -#define DDC_SCL_READ_MASK (1 << 2) -#define DDC_SCL_WRITE_MASK (1 << 5) -#define DDC_SDA_READ_MASK (1 << 3) -#define DDC_SDA_WRITE_MASK (1 << 4) - -/* holds the state of the VGA core and extended Riva hw state from riva_hw.c. - * From KGI originally. */ -struct riva_regs { - u8 attr[NUM_ATC_REGS]; - u8 crtc[NUM_CRT_REGS]; - u8 gra[NUM_GRC_REGS]; - u8 seq[NUM_SEQ_REGS]; - u8 misc_output; - RIVA_HW_STATE ext; -}; - -struct riva_par; - -struct riva_i2c_chan { - struct riva_par *par; - unsigned long ddc_base; - struct i2c_adapter adapter; - struct i2c_algo_bit_data algo; -}; - -struct riva_par { - RIVA_HW_INST riva; /* interface to riva_hw.c */ - u32 pseudo_palette[16]; /* default palette */ - u32 palette[16]; /* for Riva128 */ - u8 __iomem *ctrl_base; /* virtual control register base addr */ - unsigned dclk_max; /* max DCLK */ - - struct riva_regs initial_state; /* initial startup video mode */ - struct riva_regs current_state; -#ifdef CONFIG_X86 - struct vgastate state; -#endif - struct mutex open_lock; - unsigned int ref_count; - unsigned char *EDID; - unsigned int Chipset; - int forceCRTC; - Bool SecondCRTC; - int FlatPanel; - struct pci_dev *pdev; - int cursor_reset; - int wc_cookie; - struct riva_i2c_chan chan[3]; -}; - -void riva_common_setup(struct riva_par *); -unsigned long riva_get_memlen(struct riva_par *); -unsigned long riva_get_maxdclk(struct riva_par *); -void riva_delete_i2c_busses(struct riva_par *par); -void riva_create_i2c_busses(struct riva_par *par); -int riva_probe_i2c_connector(struct riva_par *par, int conn, u8 **out_edid); - -#endif /* __RIVAFB_H */ |